我正在使用带有JPA注释的hibernate进行关系映射.我的代码中有三个实体User
Group
&User_Group
User
和Group
正在建立ManyToMany
关系.
User_Group
是一个有点桥牌表,但有一些额外的领域.所以这是修改后的映射代码.
用户
@Entity @Table(name = "USERS") public class User { @OneToMany(mappedBy = "user") private SetuserGroups }
组
@Entity @Table(name = "GROUPS") public class Group { @OneToMany(mappedBy = "group") private SetuserGroups }
用户组
@Entity @Table(name = "USERS_GROUPS") public class UserGroup { @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "USER_ID") private User user; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "GROUP_ID") private Group group; }
当我将用户和组对象设置为用户组并保存时.
User user = new User("tommy", "ymmot", "tommy@gmail.com"); Group group = new Group("Coders"); UserGroup userGroup = new UserGroup(); userGroup.setGroup(group); userGroup.setUser(user); userGroup.setActivated(true); userGroup.setRegisteredDate(new Date()); session.save(userGroup);
事情很好.随着CascadeType.ALL
组对象和用户对象也被更新.但是当我删除userGroup对象时.子对象也被删除.
删除子对象是严格禁止的.
CascadeType.SAVE-UPDATE
在JPA 中没有,它只是保存或更新但没有删除.我如何实现这一目标.
如果我CascadeType.ALL
从映射中删除子对象不会更新,我需要更新它们.
SAVE_UPDATE用于save(),update()和saveOrUpdate(),它们是3种Hibernate专有方法.JPA只有persist()
和merge()
.因此,如果您想在Hibernate专有方法上使用级联,则需要使用Hibernate专有注释.在这种情况下,Cascade.
或者您可以停止使用Hibernate会话,而是使用标准的JPA API.
Cascade.ALL也包含DELETE。我猜解决方案是使用除DELETE之外的所有重要的Cascade类型,所以:
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}))
在您的用户组定义中。