我在父表和子表之间有一个一对多的关系。在父对象中,我有一个
List<Child> setChildren(List<Child> childs)
我在子表中也有一个外键。此外键是引用数据库中父行的ID。因此,在我的数据库配置中,此外键不能为NULL。此外,此外键是父表中的主键。
所以我的问题是,如何通过执行以下操作来自动保存子对象:
session.save(parent);
我尝试了上面的方法,但是我得到了一个数据库错误,抱怨Child表中的外键字段不能为NULL。有没有办法告诉JPA自动将这个外键设置到Child对象中,以便它可以自动保存子对象?
9条答案
按热度按时间yhived7q1#
我尝试了上面的方法,但是我得到了一个数据库错误,抱怨Child表中的外键字段不能为NULL。有没有办法告诉JPA自动将这个外键设置到Child对象中,以便它可以自动保存子对象?
好吧,这里有两件事。
首先,您需要级联保存操作(但我的理解是,您正在这样做,否则在"子"表中插入时不会违反FK约束)
第二,你可能有一个双向的关联,我认为你没有正确设置"链接的两端",你应该这样做:
常见的模式是使用链路管理方法:
代码变为:
参考
ddhy6vgd2#
我认为您需要通过xml/annotation在Map中设置cascade选项,请参考Hibernate reference example here。
如果您正在使用注解,则需要执行以下操作,
hc2pp10m3#
下面的程序描述了双向关系在Hibernate中是如何工作的。
当父对象将保存其子对象列表时,将自动保存。
在父端:
并将以下注解放在子端:
主要类别:
2jcobegt4#
在setChilds中,您可能希望尝试循环遍历列表并执行以下操作
您还应该将父节点上的级联设置为适当的值。
lymgl2op5#
以下是在双向关系的子对象中分配父对象的方法?
假设你有一个关系,比如一对多,那么对于每个父对象,都存在一组子对象。在双向关系中,每个子对象都将引用其父对象。
要实现这一点,一种方法是在持久化父对象的同时在子对象中分配父对象
另一种方法是,您可以使用hibIntercepter,这种方法有助于您不必为所有型号编写上述代码。
Hibernate拦截器提供API在执行任何数据库操作之前完成你自己的工作。同样在对象的保存上,我们可以使用反射在子对象中分配父对象。
您可以将Intercepter注册为
ct3nt3jp6#
在JPA
@*To*
关系中,父实体和子实体必须在(父)保存之前交叉分配。icnyk63a7#
使用
org.hibernate.annotations
执行Cascade
,如果hibernate
和JPA
一起使用,它不知何故会抱怨保存子对象。qyzbxkaa8#
总之将级联式设置为全部,就可以完成工作;在您的模型中添加一个示例。像这样添加代码。@OneToMany(mappedBy =“receipt”,cascade=CascadeType.ALL)private List saleSet;
omhiaaxx9#
如果您没有双向关系,并且只想保存/更新子表中的单列,那么您可以创建具有子实体的JPA存储库,并调用save/saveAll或update方法。
母公司:
孩子: