有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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,则子对象不会得到更新&;我需要更新它们


共 (2) 个答案

  1. # 1 楼答案

    SAVE_UPDATE用于SAVE()、UPDATE()和saveOrUpdate(),这是3种Hibernate专有方法。JPA只有persist()merge()。因此,如果要在Hibernate专有方法上使用级联,则需要使用Hibernate专有注释。在本例中,Cascade

    或者您可以停止使用Hibernate会话,改用标准JPAAPI

  2. # 2 楼答案

    CascadeType.ALL也包括CascadeType.REMOVE。 解决方案是使用除CascadeType.REMOVE之外所需的所有CascadeType.*,如下所示:

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

    在用户组定义中