1

我有两个班级,员工和经理。Manager 扩展了 Employee,因为它是一种员工。Employee 有一个 Manager 的实例,它代表一个员工有一个经理的想法。相反,经理有一组员工。有两个表,EMPLOYEE 和 MANAGER:

table EMPLOYEE
  long ID
  varchar NAME
  long MANAGERID

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

这些类看起来像这样:

Employee.java(为简洁起见,省略了 setter 和 getter):

@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;

管理器.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);

我已经用几名员工填满了表格,所有这些员工都有同一个经理,除了一名员工 - 那个是经理。他自己没有经理。(如果您正确地关注我,那么很明显我在 manager 表中有 1 行,其中 EMPLOYEEID 引用了 EMPLOYEE 表中的一行,它的 MANAGERID 为 null)。

所以,这个设置对我来说看起来是正确的,但是当我尝试查询所有 Employee 对象时:

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

我得到一个讨厌的堆栈跟踪:

原因:org.hibernate.PropertyAccessException:无法通过 org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:151) 的 hata.staff.entity.Employee.manager 的反射设置器设置字段值。 hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:586) at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:231) at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister. java:3824) 在 org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:153) 在 org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:898) 在 org.hibernate.loader.Loader.doQuery(Loader .java:773) 在 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)在 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236) ... 108 更多第2172章) (QueryTranslatorImpl.java:363) 在 org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 在 org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258) 在 org.hibernate.impl。 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236) 上的 QueryImpl.list(QueryImpl.java:102) ... 108 更多第2172章) (QueryTranslatorImpl.java:363) 在 org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 在 org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258) 在 org.hibernate.impl。 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236) 上的 QueryImpl.list(QueryImpl.java:102) ... 108 更多java:1258) 在 org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 在 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236) ... 108 更多java:1258) 在 org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 在 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236) ... 108 更多 原因:java.lang.IllegalArgumentException:无法在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException (UnsafeFieldAccessorImpl.java: 164) 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) 在 sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) 在 java.lang.reflect.Field.set(Field.java:680) 在org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:139) ... 124 更多

我是否编码错了,或者休眠根本无法处理这种情况?我会很感激任何帮助。

4

1 回答 1

0

manager 中的EMPLOYEEID列不应该存在。@PrimaryKeyJoinColumn表示主键也是连接列。因此, 中的IDMANAGER既是 的主键,也是外键EMPLOYEE

并且注释当然应该更改为@PrimaryKeyJoinColumn(name="ID")(或者必须将其删除,因为默认情况下使用与父表中相同的列名)

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

于 2011-10-27T21:35:11.460 回答