Hibernate中的java级联类型保存更新
我正在使用hibernate和JPA注释进行关系映射。
我的代码中有三个实体User
{User_Group
User
&Group
处于ManyToMany
关系中
User_Group
是一种bridge table but with some additional fields。下面是修改后的映射代码
使用者
@Entity
@Table(name = "USERS")
public class User {
@OneToMany(mappedBy = "user")
private Set<UserGroup> userGroups
}
团体
@Entity
@Table(name = "GROUPS")
public class Group {
@OneToMany(mappedBy = "group")
private Set<UserGroup> userGroups
}
用户组
@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对象时。子对象也将被删除
删除子对象是严格禁止的
JPA中没有CascadeType.SAVE-UPDATE
,只保存或更新,不删除。我如何做到这一点
如果从映射中删除CascadeType.ALL
,则子对象不会得到更新&;我需要更新它们
# 1 楼答案
SAVE_UPDATE用于SAVE()、UPDATE()和saveOrUpdate(),这是3种Hibernate专有方法。JPA只有
persist()
和merge()
。因此,如果要在Hibernate专有方法上使用级联,则需要使用Hibernate专有注释。在本例中,Cascade或者您可以停止使用Hibernate会话,改用标准JPAAPI
# 2 楼答案
CascadeType.ALL
也包括CascadeType.REMOVE
。 解决方案是使用除CascadeType.REMOVE
之外所需的所有CascadeType.*
,如下所示:在用户组定义中