Employee と Manager の 2 つのクラスがあります。Manager は従業員の一種であるため、Employee を拡張します。Employee には Manager のインスタンスがあり、従業員には 1 人のマネージャがいるという考えを表しています。逆に、manager には一連の Employees があります。EMPLOYEE と MANAGER の 2 つのテーブルがあります。
table EMPLOYEE
long ID
varchar NAME
long MANAGERID
table MANAGER
long ID
long EMPLOYEEID //a join on this field enables inheritance
クラスは次のようになります。
Employee.java (簡潔にするためにセッターとゲッターは省略):
@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);
私は数人の従業員でテーブルを埋めましたが、1 人の従業員 (マネージャーである従業員) を除いて、それらの従業員はすべて同じマネージャーを持っています。彼自身にはマネージャーはいません。(あなたが私を正しくフォローしている場合、manageridとしてnullを持つEMPLOYEEテーブルの行を参照するEMPLOYEEIDを使用して、managerテーブルに1行あることが明らかなはずです)。
したがって、このセットアップは私には正しいように見えましたが、すべての 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) org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:231) 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) org.hibernate.loader.Loader.doList(Loader.java:2294) org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172) org.hibernate.loader.Loader .list(Loader.java:2167) org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448) org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) 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) org.hibernate.loader.Loader.list(Loader.java:2167) で org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448) で org.hibernate.hql.ast.QueryTranslatorImpl.list (QueryTranslatorImpl.java:363) の org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) の org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258) の org.hibernate.impl. QueryImpl.list(QueryImpl.java:102) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236) ... 108 詳細2172) org.hibernate.loader.Loader.list(Loader.java:2167) で org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448) で org.hibernate.hql.ast.QueryTranslatorImpl.list (QueryTranslatorImpl.java:363) の org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) の org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258) の org.hibernate.impl. QueryImpl.list(QueryImpl.java:102) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236) ... 108 詳細java:1258) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236) ... 108 詳細java:1258) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) at 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 詳細
私はこれを間違ってコーディングしましたか、それとも休止状態でこのシナリオを処理できませんか? 助けていただければ幸いです。