当前位置:  开发笔记 > 编程语言 > 正文

在Hibernate中级联类型保存更新

如何解决《在Hibernate中级联类型保存更新》经验,为你挑选了2个好方法。

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

UserGroup正在建立ManyToMany关系.

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

用户

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

@OneToMany(mappedBy = "user")
private Set userGroups
}

@Entity
@Table(name = "GROUPS")
public class Group {
@OneToMany(mappedBy = "group")
private Set 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对象时.子对象也被删除.

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

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

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



1> JB Nizet..:

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

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



2> Bevor..:

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

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}))

在您的用户组定义中。

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有