2

オブジェクトモデルを次のように定義したいと思います。

AにはXのリストが含まれ、各XにはYが含まれ、各YはBを参照します。AとBをとして設定しEntity、XとYは両方ともEmbeddableです。Aには、@ElementCollectionListofX型のが含まれています。これらのクラスのコードは次のとおりです。

を使用してこのモデルのSQLを生成するようにHibernate(3.6.10)に要求する場合SchemaExport、A、B、およびA.id、B.id、およびを含むAからBへの参照用のコレクションテーブルの3つのテーブルが必要です。リストの順序を維持するための順序列。代わりに、Hibernateは私に次のことを提供します。

create table CollectionOfB (A_ID bigint not null, embeddableAList_ORDER integer not null, primary key (A_ID, embeddableAList_ORDER))
create table EntityA (id bigint not null, primary key (id))
create table EntityB (id bigint not null, primary key (id))
alter table CollectionOfB add constraint FKFEABC9AD9AECF0BB foreign key (A_ID) references EntityA

コレクションテーブルにはB.idの列がなく、外部キーの制約もありません。私の希望するモデルがサポートされるべきだと私には思えます。それは正当な理由で機能しませんか(もしそうなら、その理由は何ですか?)、またはこれはHibernateまたはJPAのバグ/欠落機能ですか?


実験として、Embeddable関係を折りたたんで1つのレベルしか持たないようにしました(Yを完全に削除し、Bへの参照をXの中に入れます)。その変更により、スキーマは期待どおりに生成されるため、が機能するElementCollection場所をEmbeddable持つという基本的な考え方は次のManyToOneとおりです。

create table CollectionOfB (A_ID bigint not null, B_ID bigint, embeddableAList_ORDER integer not null, primary key (A_ID, embeddableAList_ORDER))
create table EntityA (id bigint not null, primary key (id))
create table EntityB (id bigint not null, primary key (id))
alter table CollectionOfB add constraint FKFEABC9AD9AED651B foreign key (B_ID) references EntityB
alter table CollectionOfB add constraint FKFEABC9AD9AECF0BB foreign key (A_ID) references EntityA

さらに、別のCを作成し、それをX(Xではなく)を持つEntityものとして定義すると、Bへの参照が正しくなります。したがって、下位レベルが存在する場所に2つのレベルがあるという考え機能します。EmbeddableElementCollectionEmbeddableManyToOne


@Embeddable
public class EmbeddedX {
    // Comment out to "collapse" X and Y
    @Embedded
    EmbeddedY embeddedY;

    // Comment in to "collapse" X and Y
    //    @JoinColumn(name = "B_ID")
    //    @ManyToOne(fetch = FetchType.EAGER)
    //    EntityB entityB;
}


@Embeddable
public class EmbeddedY {
    @JoinColumn(name = "B_ID")
    @ManyToOne(fetch = FetchType.EAGER)
    EntityB entityB;
}

@Entity
public class EntityA {
    @Id
    Long id;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "CollectionOfB", joinColumns = @JoinColumn(name = "A_ID"))
    @Column(name = "Bs")
    @OrderColumn
    List<EmbeddedA> embeddableAList;
}

@Entity
public class EntityB {
    @Id
    Long id;
}

public void testSchema() throws Exception {
    Configuration config = new Configuration().addAnnotatedClass(EntityA.class).addAnnotatedClass(EntityB.class);
    config.setProperty(Environment.DIALECT, HSQLDialect.class.getName());

    new SchemaExport(config).create(true, false);
}
4

0 に答える 0