2011-10-27 38 views
1

我有兩個類Employee和Manager。經理擴展員工,因爲它是一種類型的員工。員工有一個管理者實例,它代表了擁有一位管理者的員工的想法。相反,經理有一組僱員。有兩個表,員工和經理:子和超類之間的雙向OneToMany關聯不起作用(JPA和Hibernate 3.6.7)

table EMPLOYEE 
    long ID 
    varchar NAME 
    long MANAGERID 

table MANAGER 
    long ID 
    long EMPLOYEEID //a join on this field enables inheritance 

的類是這樣的:

Employee.java(setter和略去了干將):

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "EMPLOYEE", schema = "TEST01") 
public class Employee extends hata.util.Entity implements java.io.Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name = "ID", unique = true, nullable = false) 
    protected Long id; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "MANAGERID") 
    protected Manager manager; 

    @Column(name = "FIRSTNAME", nullable = false, length = 50) 
    protected String firstname; 

Manager.java

@Entity 
@PrimaryKeyJoinColumn(name="EMPLOYEEID") 
@Table(name = "MANAGER", schema = "TEST01") 
public class Manager extends Employee implements java.io.Serializable { 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "manager") 
    private Set<Employee> employees = new HashSet<Employee>(0); 

我已經填寫了一些員工的表,所有這些員工都有相同的m渴望,除了一名員工 - 那位經理。他本人沒有經理。 (如果你正確地關注我,那麼應該很明顯,我在管理器表中有1行,並且EMPLOYEEID返回到EMPLOYEE表中具有NULL的行,因爲它是MANAGERID)。

因此,這種設置正確看着我,但是當我試圖查詢所有Employee對象有:

Query q = em.createQuery("select em from Employee em"); 
result = (List<Employee>) q.getResultList(); 

我得到一個討厭的堆棧跟蹤:

造成的:org.hibernate作爲。 PropertyAccessException:無法通過hata.staff.entity.Employee.manager 的org.hibernate.property.DirectPropertyAccessor設置字段值。$ DirectSetter.set(DirectPropertyAccessor.java:151) at org.hibernate.tuple.entity .AbstractEntityTuplizer.setPropertyValues(AbstractEntityTu plizer.java:586) 在org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:231) 在org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3824) 在有機hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:153) at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:898) at org.hibernate.loader.Loader.doQuery(Loader.java:773) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270) at org.hibernate.loader.Loader.doList(Loader.java:2294) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader。 java:2172) at org.hibernate.loader.Loader.list(Loader.java:2167 ) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448) at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) at org.hibernate.engine.query .HQLQueryPlan.performList(HQLQueryPlan.java:196) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) at org .hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236) ... 108更多 引起:java.lang.IllegalArgumentException:無法設置hata.staff.entity.Manager字段hata.staff.entity.Employee .manager to hata.staff.entity.Employee at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentEx ception(UnsafeFieldAccessorImpl.java:164) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) at sun.reflect.UnsafeObjectFieldAccessorImpl。集(UnsafeObjectFieldAccessorImpl.java:81) 在java.lang.reflect.Field.set(Field.java:680) 在org.hibernate.property.DirectPropertyAccessor $ DirectSetter.set(DirectPropertyAccessor.java:139) ... 124更多

我編碼錯了,還是可以休眠根本不處理這種情況?我會很感激任何幫助。

回答

0

經理中的EMPLOYEEID列不應該在那裏。 @PrimaryKeyJoinColumn表示主鍵也是連接列。因此,MANAGER中的ID列是EMPLOYEE的主鍵和外鍵。

並且註釋,當然應該改爲@PrimaryKeyJoinColumn(name="ID")(或它必須拆除,因爲默認是使用相同的列名作爲父表)

http://download.oracle.com/javaee/6/api/javax/persistence/PrimaryKeyJoinColumn.html

+0

非常感謝你,你是一個天才。我根據你的指示修復了它,現在它完美運行! – bitsmcgee77

相關問題