オブジェクトモデルを次のように定義したいと思います。
AにはXのリストが含まれ、各XにはYが含まれ、各YはBを参照します。AとBをとして設定しEntity
、XとYは両方ともEmbeddable
です。Aには、@ElementCollection
ListofX型のが含まれています。これらのクラスのコードは次のとおりです。
を使用してこのモデルの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つのレベルがあるという考えも機能します。Embeddable
ElementCollection
Embeddable
ManyToOne
@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);
}