我正在尝试在 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
。 如果我不 cascade-persist,我不知道什么时候设置
binary.entity_id
自己,如何持久化映射的对象,我最终得到:org.hibernate.TransientObjectException:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例:ContainerEntity.binary -> Binary
换句话说,我想但目前未能像这样坚持这两个实体:
containerEntity = new ContainerEntity();
containerEntity.setBinary( new Binary() );
entityManager.persist(containerEntity);
有什么想法或有用的建议吗?
关于赏金的注意事项:这个问题还没有答案,我可以接受为“正确”,尽管还有一个提示我将在下周检查。不过,我的赏金时间已经结束,所以我会将其奖励给迄今为止最接近的答案。