0

我在与作为所有者的一对多方建立双向关联时遇到问题。我将使用稍作修改的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 添加到插入中,而不是稍后用它更新记录?有没有办法让我做我上面描述的事情?

4

1 回答 1

0

问题是insertable=false, updatable=false.

这是明确告诉 Hibernate 在插入或更新 Soldier 实体时不要更新。troop_fk

但是您仍然无法在不先将其与部队关联的情况下插入新的 Soldier 实体,因为 fk 列不可为空。

如果您希望能够在没有部队的情况下创建士兵,那么您需要将关联设为可选:@ManyToOne(optional=true).

我会更改部队的@OneToMany协会以使用mappedBy. 在我们系统中的 300 多个实体中,我们从未@JoinColumn@OneToMany侧面使用过 a。

于 2014-05-02T01:09:02.377 回答