【发布时间】:2013-05-30 15:18:02
【问题描述】:
使用 JPA 注释和 hibernate,我们最近遇到了一个单向单映射问题,如下所示:
@Entity
public class FooOrder extends AbstractEntity{
@OneToMany(cascade= CascadeType.ALL,orphanRemoval = true)
@JoinColumn(name = "fooOrderId")
private List<FooItem> fooItems = new ArrayList<FooItem>();
public void addFooItem(foo item properties here)
{
fooItems.add(fooItem);
}
}
@Entity
public class FooItem extends AbstractEntity {
SomeRandomStuffButNoLinkToParent
}
测试代码基本上是这样的:
FooOrder fooOrder = new FooOrder(stuff here);
fooOrder.addFooItem(foo item properties here);
fooOrder = fooOrderRepository.save(fooOrder);
当我们对此运行测试时,我们会得到如下所示的 sql:
insert FooOrder(columns here)
insert FooItem(columns here missing the FK to FooOrder)
update FooItem set FooOrderFK to proper key.
但如果我设置@JoinColumn(name = "activeOrderId", nullable = false) 那么我的 sql 看起来像这样:
insert FooOrder(columns here)
insert FooItem(columns here with FK to FooOrder)
为什么hibernate可以通过update来设置FK,如果FK可以为空,却在不可以为空的时候在insert中设置?
【问题讨论】:
-
为什么会出现问题?这似乎是休眠中的实现/设计决策
-
我碰巧遇到了这个问题,因为数据库中的一个字段被设置为不可为空,即使映射没有反映这一点。遇到是件好事,因为它让我们知道我们有一个不匹配,但我认为这很有趣,而且如果一个就足够了,做 2 次操作似乎很奇怪。
-
如果 fk-column 不可为空,实体上的持久化操作必须自动失败;如果不是,则关系上的插入操作可能会自行失败,恢复(提交主实体或回滚所有内容)将留给您的代码。