Employee
同じ構造 (例:と)を持つ 2 つのテーブル (アクティブなテーブルとアーカイブ テーブル) がありますEmployeeArchive
。共通のコードを利用して両方のテーブルの結果を使用できるようにするために、すべてのメソッドと注釈を定義する抽象親クラスがあります。両方のテーブルに同じクエリを使用し、結果を結合するクエリを実行できるようにしたいと考えています。
との/双方向の関係を持つ別のエンティティ/テーブル (例: Organization
) があります。には があり、すべての従業員には組織があります。関連付けを介して組織の従業員を取得する場合、アーカイブではなく、アクティブなテーブルからの従業員のみが必要です。onetomany
manytoone
Employee
Organization
List
Employee
私たちが試みていることを達成する方法、または実行可能な回避策はありますか?
@ MappedSuperclass
、@Entity
/のさまざまな実装@InheritanceType.TABLE_PER_CLASS
を試して、目的を達成しようとしました。各実装は、私たちが望むものをほぼ達成しますが、完全には達成しません。たとえば、両方のテーブルをクエリできるようにするには、抽象的な親Entity
を持つことInheritanceType.TABLE_PER_CLASS
ができますが、. を親として使用して正しい関係を持つことができますが、ユニオンを介してとテーブルの両方をクエリすることはできません。mappedBy
Employee
Organization
MappedSuperclass
Archive
Active
基本的に、レイアウトしようとしているものは次のとおりです。
@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)