我在与作为所有者的一对多方建立双向关联时遇到问题。我将使用稍作修改的Hibernate 文档中的示例来描述我的问题。
@Entity
public class Troop {
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="troop_fk") //we need to duplicate the physical information
public Set<Soldier> getSoldiers() {
...
}
@Entity
public class Soldier {
@ManyToOne()
@JoinColumn(name="troop_fk", insertable=false, updatable=false, nullable = false)
public Troop getTroop() {
...
}
我知道在数据库世界中,上述关系的所有者将是士兵,因为它具有带有外键的列,但是这在现实世界的逻辑中没有意义,因为士兵是部队的一部分,而部队拥有士兵。
当我坚持他们的部队时,我希望能够使用 CascadeType.ALL 自动保存所有士兵。
休眠文档表明:
此解决方案未优化,将产生额外的 UPDATE 语句。
例如。日志
Insert Into Troop(id) Values(1)
Insert Into Soldier(id) Values(1)
Insert Into Soldier(id) Values(2)
Update Soldier Set troop_fk = 1 Where id = 1
Update Soldier Set troop_fk = 1 Where id = 2
问题是,当我们第一次尝试在没有 troop_fk 的情况下插入士兵时,会抛出异常,因为该列不可为空。
为什么 Hibernate 不只是将 troop_fk 添加到插入中,而不是稍后用它更新记录?有没有办法让我做我上面描述的事情?