我正在使用带有JPA注释的hibernate进行关系映射。
我的代码中有三个实体User
Group
& 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;
}
当我设置用户&amp;将对象分组到用户组&amp;保存它。
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
组对象&amp;用户对象也会更新。但是当我删除userGroup对象时。子对象也被删除。
删除子对象是严格禁止的。
JPA中没有CascadeType.SAVE-UPDATE
,它只是保存或更新但没有删除。我如何实现这一目标。
如果我从映射中删除CascadeType.ALL
,则子对象不会更新&amp;我需要更新它们。
答案 0 :(得分:8)
SAVE_UPDATE用于save(),update()和saveOrUpdate(),它们是3种Hibernate专有方法。 JPA只有persist()
和merge()
。因此,如果您想在Hibernate专有方法上使用级联,则需要使用Hibernate专有注释。在这种情况下,Cascade。
或者你可以停止使用Hibernate Session,而是使用标准的JPA API。
答案 1 :(得分:3)
Cascade.ALL也包含DELETE。 我想解决方案是使用除DELETE之外所需的所有重要级联类型,所以:
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}))
在您的UserGroup定义中。