在Hibernate中级联类型保存更新

und*_*dog 7 java hibernate

我正在使用带有JPA注释的hibernate进行关系映射.我的代码中有三个实体User Group&User_Group

UserGroup正在建立ManyToMany关系.

User_Group是一个有点桥牌表,但有一些额外的领域.所以这是修改后的映射代码.

用户

@Entity
@Table(name = "USERS")
public class User {

@OneToMany(mappedBy = "user")
private Set<UserGroup> userGroups
}
Run Code Online (Sandbox Code Playgroud)

@Entity
@Table(name = "GROUPS")
public class Group {
@OneToMany(mappedBy = "group")
private Set<UserGroup> userGroups
}
Run Code Online (Sandbox Code Playgroud)

用户组

@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;
}
Run Code Online (Sandbox Code Playgroud)

当我将用户和组对象设置为用户组并保存时.

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);
Run Code Online (Sandbox Code Playgroud)

事情很好.随着CascadeType.ALL组对象和用户对象也被更新.但是当我删除userGroup对象时.子对象也被删除.

删除子对象是严格禁止的.

CascadeType.SAVE-UPDATE在JPA 中没有,它只是保存或更新但没有删除.我如何实现这一目标.

如果我CascadeType.ALL从映射中删除子对象不会更新,我需要更新它们.

JB *_*zet 9

SAVE_UPDATE用于save(),update()和saveOrUpdate(),它们是3种Hibernate专有方法.JPA只有persist()merge().因此,如果您想在Hibernate专有方法上使用级联,则需要使用Hibernate专有注释.在这种情况下,Cascade.

或者您可以停止使用Hibernate会话,而是使用标准的JPA API.

  • 不。我的回答告诉你怎么做:使用 Cascade 注释。这并不妨碍您使用 JPA 映射注释。您只需要这个额外的 Hibernate 注释来指定 JPA 中不存在的级联选项。 (2认同)
  • @Amalgovinus,您错过了要点:无法使用标准 JPA 级联类型来级联特定于 Hibernate 的操作 (SAVE_UPDATE),因此 JPA 中不存在。因此,要么停止使用 SAVE_UPDATE 等特定于 Hibernate 的操作(并使用 persist/merge),然后可以使用标准 JPA 级联选项,要么接受使用特定于 Hibernate 的操作,因此还需要使用特定于 Hibernate 的注释。OP接受了答案,所以我认为答案就是他想要的。 (2认同)

Bev*_*vor 5

Cascade.ALL也包含DELETE。我猜解决方案是使用除DELETE之外的所有重要的Cascade类型,所以:

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}))
Run Code Online (Sandbox Code Playgroud)

在您的用户组定义中。