Hibernate

时间:2016-01-03 13:00:29

标签: java hibernate

我正在使用带有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;我需要更新它们。

2 个答案:

答案 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定义中。