1

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 詳細

私はこれを間違ってコーディングしましたか、それとも休止状態でこのシナリオを処理できませんか? 助けていただければ幸いです。

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 に答える