gpt4 book ai didi

java - 为什么 nullable = false 会强制在插入时插入 FK,但如果没有它,它会进行更新以在 JPA/Hibernate 中设置 FK

转载 作者:搜寻专家 更新时间:2023-11-01 03:53:29 25 4
gpt4 key购买 nike

使用 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 在可以为 null 的情况下通过更新设置 FK,但在不可为 null 的情况下在插入中设置它?

最佳答案

当外键不能为空时

insert FooOrder(columns here)
insert FooItem(columns here with FK to FooOrder)

是实际执行插入的唯一方法。所以真正的问题是为什么不总是这样做。

我对此的看法是,使用更新的方式在另一种方式永远不起作用的时候起作用。

假设我们有某种循环外键关系。A 有 B 的外键B 有 A 的外键如果这些外键都不可以为空,则可能无法插入它。您不能先插入 A,因为 B 的外键不能为空。B 也一样。

另请注意,我的示例可能过于简单化了。这个循环外键可以由任意数量的表引起。

因此,首先插入数据然后添加外键正是在这种更复杂的情况下的工作方式。您的非空约束迫使 Hibernate 采取另一种方式。对于默认情况,首先插入然后添加键是更好的主意。

关于java - 为什么 nullable = false 会强制在插入时插入 FK,但如果没有它,它会进行更新以在 JPA/Hibernate 中设置 FK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16839917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com