保存Hibernate JPA子实体的正确方法是什么

时间:2017-04-04 13:32:52

标签: hibernate jpa save entity parent-child

我可以为我的生活做好准备,不要理解这一点。

我们使用Intellij生成标准Entity对象。 我现在正试图保存父母的孩子关系。

我有2个表,event_person_register和event_user_role。这就是我的尝试。

eventPersonRegister.setEventUserRolesByPersonRegisterId(new ArrayList<>());

EventUserRole eventUserRole = new EventUserRole();
eventUserRole.setEventPersonRegisterByUserRoleLinkPersonId(eventPersonRegister);
eventUserRole.setUserRole("ROLE_USER");
eventPersonRegister.getEventUserRolesByPersonRegisterId().add(eventUserRole);

eventPersonRegisterRepository.save(eventPersonRegister);

只有父级保存到DB而不是子级记录。 我没有在OneToMany注释上放置任何Cascade或fetch类型。一个注册人可以担任多个角色。

更新1:

我在eventPersonRegister实体中尝试了以下内容:

@OneToMany(fetch=FetchType.LAZY, mappedBy = "eventPersonRegisterByUserRoleLinkPersonId", cascade=CascadeType.ALL)

但是得到错误:

MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails

如果我从user_role方面尝试,那么我不会收到任何错误,但只保存父级而不是子级。

1 个答案:

答案 0 :(得分:1)

正如您所说,您可以在OneToMany端使用级联。

如果您不想使用级联,另一个选项是:

//persist eventPersonRegister
eventPersonRegister.setEventUserRolesByPersonRegisterId(new ArrayList<>());
entityManager.persist(eventPersonRegister); 

//persist eventUserRole
EventUserRole eventUserRole = new EventUserRole();
eventUserRole.setUserRole("ROLE_USER");
entityManager.persist(eventUserRole);

//set the relation between eventUserRole and eventPersonRegister
eventUserRole.setEventPersonRegisterByUserRoleLinkPersonId(eventPersonRegister);  
eventPersonRegister.getEventUserRolesByPersonRegisterId().add(eventUserRole);