私は、Eclipselink と TABLE_PER_CLASS 継承戦略を備えた単純な Java EE 7 Web アプリケーションを持っています。
次のクラス:
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Entity
public abstract class AbstractService implements Serializable {
private static final long serialVersionUID = 7041207658121699813L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn
private PersonGroup personGroup;
}
@Entity
public class Service extends AbstractService implements Serializable {
private static final long serialVersionUID = 3817106074951672799L;
}
@Entity
public class PersonGroup implements Serializable {
private static final long serialVersionUID = 3205092801888510996L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "personGroup")
private List<AbstractService> services;
}
persistence.xml で Drop&Create を行います。
データベースを作成すると、次のテーブルが作成されます。
抽象サービス、サービス、個人グループ
ポイントは、eclipselink が属性 persongroup_id ("id" 属性なし) (のみ (!)) を持つテーブル abstractservice を作成することです。なんで?
TABLE_PER_CLASS からの私の理解は、すべての属性とキーが「ダウン」しているため、abstractservice には属性がなく、存在してはならないということです。
私のビジネスケースは、AbstractService からのサブサービスがたくさんあるということです。特別な人物グループを使用して、AbstractService からすべてのサブサービスを取得したいと考えています。
すべてがサービス中のため、AbstractService テーブルにはエントリがありません。
CriteriaBuilder では、次のように言います。
Select from AbstractService where persongroup_id = 123;
私はTABLE_PER_CLASSを持っているので、Criteria Apiはこれを構築する必要があります(さらにサブサービスが存在する場合は、いくつかのユニオンを使用して):
Select from Service where persongroup_id = 123;
eclipselink が abstractService で persongroup_id を作成するのはなぜですか? また、どうすれば解決できますか? abstractService が空であるため、最後にクエリの結果は常に空です...