0

私は、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 が空であるため、最後にクエリの結果は常に空です...

4

1 に答える 1

0

ここで同じ質問がされました: http://www.eclipse.org/forums/index.php/t/406338/ バグに関連しているようですhttps://bugs.eclipse.org/bugs/show_bug.cgi?id =265702これは修正されましたが後退しました。最新バージョンでこれが見られる場合は、新しいバグを報告する必要があります。

単一の Servide サブクラスのみを使用している場合は、代わりにそれをマップされたスーパークラスにすることをお勧めします。そうでない場合は、通常、結合テーブルや単一テーブルなどの別の継承タイプが推奨されます。このバグは DDL 生成にのみ影響するようです。そのため、JPA にスクリプトを作成させるように切り替えてから、編集して AbstractService テーブル エントリを削除することができます。

于 2014-02-13T15:28:06.720 に答える