Hibernate で次のテーブル間の関係をマッピングしようとしています。
create table binary (
id number not null primary key,
data blob,
entity_class varchar(255) not null,
entity_id number not null,
unique (entity_id, entity_class)
);
create table container_entity (
id number not null primary key,
...
);
バイナリ テーブルは、任意の他のテーブルのバイナリ データを保持することになっています。「外部キー」は、データベース用語ではありませんが、binary.entity_class
とで構成されますbinary.entity_id
。これは私が今のところ受け入れなければならない構成であり、ここで混乱を引き起こしているようです. 列binary.entity_id
は集計テーブルの主キーを参照binary.entity_class
し、集計テーブル自体を定義します。
BINARY CONTAINER_ENTITY_A CONTAINER_ENTITY_B
id entity_class entity_id id id ...
------------------------------- ------------------ ------------------
1 ContainerEntityA 1 -> 1 ...
2 ContainerEntityB 1 -> 1
3 ContainerEntityB 2 -> 2
ContainerEntity のマッピングは、読み取り専用で使用されている場合は既に機能しています。
@Entity @Table(name="container_entity_a")
public class ContainerEntityA {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(column =
@JoinColumn(name = "id", referencedColumnName = "entity_id",
insertable=false, updatable=false)),
@JoinColumnOrFormula(formula =
@JoinFormula(value = "'ContainerEntityA'", referencedColumnName = "entity_class"))
})
private Binary binary;
public void setBinary(Binary aBinary) {
aBinary.setEntityClass("ContainerEntityA");
this.binary = aBinary;
}
}
@Entity @Table(name="binary")
public class Binary {
@Column(name = "entity_id", nullable = false)
private Long entityId;
@Column(name = "entity_class", nullable = false)
private String entityClass;
}
しかし、ContainerEntity の永続化に問題があります:
CascadeType.PERSIST
Hibernateを指定しただけでは、設定に失敗しますbinary.entity_id
。カスケード永続化しないと、
binary.entity_id
自分自身をいつ設定するのか、マップされたオブジェクトを永続化する方法がわからず、次のようになります。org.hibernate.TransientObjectException: オブジェクトが保存されていない一時インスタンスを参照しています - フラッシュする前に一時インスタンスを保存します: ContainerEntity.binary -> Binary
言い換えれば、私は望んでいますが、現在、次のように両方のエンティティを永続化することに失敗しています:
containerEntity = new ContainerEntity();
containerEntity.setBinary( new Binary() );
entityManager.persist(containerEntity);
アイデアや役立つ提案はありますか?
報奨金に関する注意:この質問に対する「正しい」と受け入れることができる答えはまだありませんが、来週確認するヒントがもう 1 つあります。懸賞金の時間は終わったので、これまでに最も近い回答に賞を授与します.