最近在學習Hibernate,在配置一對多,多對一的映射關係時遇到了:
Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for employee in class com.learn.pojo2.Department
at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:306)
at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:299)
at org.hibernate.mapping.Property.getGetter(Property.java:294)
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:300)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:141)
at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:78)
... 31 more
查看代碼之後找到了問題,在於配置與pojo類屬性名字不一致,這個問題應該在使用代碼智能提示的情況下更容易出現,下面是源代碼:
public class Department {
private Integer id ;
private String name ;
//如果是代碼智能提示,在定義集合時,集合名會主動設置成複數形式
private Set<Employee> employees = new HashSet<Employee>();
//省略getter、setter
}
再看Department.hbm.xml文件中對Set集合的配置
<!-- 這裏在是手動配置時會設置成與對應類名相同的名稱 -->
<set name="employee" inverse="false">
<key column="departmentId"></key>
<one-to-many class="com.learn.pojo2.Employee"/>
</set>
這就出現問題了,也就是xml文件中的name屬性值與類中屬性名不一致,Hibernate在執行時會找與name屬性值對應的getter 、setter 方法,顯然是找不到的
解決方法:在定義時兩者名稱相同,只要相同就可以,不需要與對應的類名相同