在啟動 Hibernate 專案時拋出異常:
Caused by: org.hibernate.MappingException: class main.java.POJO.User not found while looking for property: id
這通常發生在 .hbm.xml 映射檔中,Hibernate 無法根據預設反射找到屬性的類型。
Hibernate 在解析 <id> 或 <property> 時,若未明確指定 type 屬性,會嘗試透過反射推斷類型。若實體類未編譯、類路徑錯誤、或屬性為基本型別(如 int)而非包裝型別(Integer),可能導致推斷失敗。
<hibernate-mapping package="main.java.POJO">
<class name="User" table="loginuser">
<id name="id" column="Id">
<generator class="native"/>
</id>
<property name="username" column="username" />
<property name="password" column="password" />
<property name="sex" column="sex" />
</class>
</hibernate-mapping>
<hibernate-mapping package="main.java.POJO">
<class name="User" table="loginuser">
<id name="id" column="Id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="username" column="username" type="java.lang.String"/>
<property name="password" column="password" type="java.lang.String"/>
<property name="sex" column="sex" type="java.lang.String"/>
</class>
</hibernate-mapping>
Integer、Long、Boolean 而非 int、long、boolean,方便表達 null。<hibernate-mapping package="..."> 若指定,class name 只需寫簡短類名;否則需寫全限定名。.class 檔已正確編譯至 classpath。| Java 類型 | Hibernate type 屬性值 |
|---|---|
| int / Integer | integer / java.lang.Integer |
| long / Long | long / java.lang.Long |
| String | string / java.lang.String |
| Date / Timestamp | date / timestamp / java.sql.Timestamp |
| BigDecimal | big_decimal / java.math.BigDecimal |
| byte[] | binary / materialized_blob |
顯式指定 type 屬性是解決該錯誤最直接、最穩健的方法。養成在映射檔中完整宣告類型的習慣,能避免許多莫名其妙的啟動異常。