4

Employee同じ構造 (例:と)を持つ 2 つのテーブル (アクティブなテーブルとアーカイブ テーブル) がありますEmployeeArchive。共通のコードを利用して両方のテーブルの結果を使用できるようにするために、すべてのメソッドと注釈を定義する抽象親クラスがあります。両方のテーブルに同じクエリを使用し、結果を結合するクエリを実行できるようにしたいと考えています。

との/双方向の関係を持つ別のエンティティ/テーブル (例: Organization) があります。には があり、すべての従業員には組織があります。関連付けを介して組織の従業員を取得する場合、アーカイブではなく、アクティブなテーブルからの従業員のみが必要です。onetomanymanytooneEmployeeOrganizationListEmployee

私たちが試みていることを達成する方法、または実行可能な回避策はありますか?

@ MappedSuperclass@Entity/のさまざまな実装@InheritanceType.TABLE_PER_CLASSを試して、目的を達成しようとしました。各実装は、私たちが望むものをほぼ達成しますが、完全には達成しません。たとえば、両方のテーブルをクエリできるようにするには、抽象的な親Entityを持つことInheritanceType.TABLE_PER_CLASSができますが、. を親として使用して正しい関係を持つことができますが、ユニオンを介してとテーブルの両方をクエリすることはできません。mappedByEmployeeOrganizationMappedSuperclassArchiveActive

基本的に、レイアウトしようとしているものは次のとおりです。

    @Entity
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public abstract class AbstractEmployee {
        @ManyToOne
        @JoinColumn(name="employeeId", nullable=false)
        Organization org;
        ...
    }

    @Entity
    public class Employee extends AbstractEmployee {
    }

    @Entity
    public class EmployeeArchive extends AbstractEmployee {
    }

    @Entity
    public class Organization {
       @OneToMany(cascade=ALL, mappedBy="org")
       List<Employee> employees;         
       ...            
    }

コード

    public List<AbstractEmployee> getAllEmployees()
    {
       Query query = em.createQuery("SELECT e FROM AbstractEmployee e where e.name = ‘John’", AbstractEmployee.class);
       return query.getResultList();
    }

    public List<Organization> getOrganizations()
    {
       Query query = em.createQuery("SELECT e FROM Organization o ", Organization.class);
       List<Organization> orgs = query.getResultList();
       // fetch or eager fetch the Employees but only get the ones from the active employee table
       return orgs;
    }

また、親クラスに を拡張させMappedSuperclass、実装と注釈MappedSuperclassを入れようとしAnnotationExceptionましたが、Organization

    @MappedSuperclass
    public abstract class AbstractMapped {
        @ManyToOne
        @JoinColumn(name="employeeId", nullable=false)
        Organization org;
    }

    @Entity
    @Inheritance(@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS))
    public abstract class AbstractEmployee extends AbstractMapped {
        ... `Constructors` ...
    }

デプロイ時に、次の例外が発生します。

    Caused by org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: Employee.org in Organizaztion.employees
       at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:685)
4

3 に答える 3

1

これは、休止状態に関する厄介なことの 1 つです。これを行う方法は、次のような別の抽象クラス AbstractMapped を用意することです。

@MappedSuperclass
public abstract class AbstractMapped {

}

次に、AbstractEmployee に AbstractMapped を拡張させます。次に、2 つのタグが相互に排他的であっても、AbstractEmployee をエンティティとマップされたスーパークラスの両方として使用します。

于 2013-06-23T06:10:00.923 に答える