Java 在JPA或Hibernate中更新多个关系

Java 在JPA或Hibernate中更新多个关系,java,hibernate,jpa,Java,Hibernate,Jpa,我有两个实体如下所示 @Entity @Table(name = "USER") public class User { @Id private Long id; private String name; @ManyToMany(fetch = FetchType.LAZY, mappedBy = "groupMemberList") @Fetch(FetchMode.SELECT) private List<Group> grou

我有两个
实体
如下所示

@Entity
@Table(name = "USER")
public class User {
    @Id
    private Long id;

    private String name;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "groupMemberList")
    @Fetch(FetchMode.SELECT)
    private List<Group> groupList = new ArrayList<>();

    // Getters - Setters
}


@Entity
@Table(name = "GROUP")
public class Group {
    @Id
    private Long id;

    private String name;

    @ManyToMany(fetch = FetchType.LAZY/*, mappedBy = "groupList"*/)
    @Fetch(FetchMode.SELECT)
    @JoinTable(name = "SEC_GROUP_VS_MEMBER", joinColumns = @JoinColumn(name = "GROUP_ID"),
            inverseJoinColumns = @JoinColumn(name = "MEMBER_ID"))
    private List<User> groupMemberList;

    // Getters - Setters
}
方法#2

public boolean updateUser(Long userId, List<Group> groupList) {
    User user = hibernateTemplate.get(User.class, userId);

    user.setGroupList(groupList);
    hibernateTemplate.merge(user); // User not updated with the groups
    return true;
}
public boolean updateUser(长用户标识,列表组列表){
User User=hibernateTemplate.get(User.class,userId);
user.setGroupList(groupList);
hibernateTemplate.merge(user);//未使用组更新用户
返回true;
}

第一种方法很好,但第二种方法不行。但是,当我将
联接表
Group.class
移动到
User.class
时,第二种方法工作正常,而不是第一种方法。

问题是
拥有实体
问题

假设
Staff
User
的一个子类,那么您的问题是关系中只有一方是所属实体。
mappedBy=“groupMemberList”
使
实体成为所属实体,因此仅保留对该实体的更改。这意味着您必须在这两种情况下更新
实体中的
组成员列表
。如果您有一个
用户的组列表
,则必须迭代组列表并将
用户
添加到其中。
User
中的
groupList
仅用于检索

给定
用户
组成员
实体:

@Entity
public class User {
    @Id @GeneratedValue
    private Long id;

    @ManyToMany(mappedBy = "groupMemberList")
    private List<GroupMember> groupList;

@Entity
public class GroupMember {
    @Id @GeneratedValue
    private Long id;

    @ManyToMany
    private List<User> groupMemberList;
参考:


亲爱的@K.Nicholas我可以在两个实体中使用
mappedBy
?如果是这样,会有什么不良影响?@Mr.Mak根据JPA上的所有文档,您将
mappedBy
标记拥有方。显然,一个关系不能有两个拥有方!不,但如果没有映射到的
则实体本身拥有多个关系,但是,如果您有两个多个注释,那么您最终会得到两个单独的关系表,它们映射相同的关系,您可能会疯狂地试图跟踪所有注释,DBA会将您永远列入黑名单,您的经理会称您为天才。见上文参考资料。
@Entity
public class User {
    @Id @GeneratedValue
    private Long id;

    @ManyToMany(mappedBy = "groupMemberList")
    private List<GroupMember> groupList;

@Entity
public class GroupMember {
    @Id @GeneratedValue
    private Long id;

    @ManyToMany
    private List<User> groupMemberList;
// create starting user and membergroup    
tx.begin();
User user = new User();
em.persist(user);
GroupMember group = new GroupMember();
em.persist(group);
tx.commit();
em.clear();

// update users for groupId 2
System.out.println("update users for groupId 2");
tx.begin();
List<User> users = new ArrayList<>();
users.add(user);
group.setGroupMemberList(users);
em.merge(group);            
tx.commit();
em.clear();

// update groups for userId 1 -- doesn't work, not owner of relationship
System.out.println("update groups for userId 1 -- doesn't work, not owner of relationship");
tx.begin();
List<GroupMember> groups = new ArrayList<>();
groups.add(group);
user.setGroupList(groups);
em.merge(user);            
tx.commit();
em.clear();

// update groups for userId 1 -- works
System.out.println("update groups for userId 1 -- works");
tx.begin();
for ( GroupMember groupMember: groups) {
    groupMember.getGroupMemberList().add(user);
    em.merge(groupMember);            
}
tx.commit();
em.clear();
Hibernate: insert into User (id) values (?)
Hibernate: insert into GroupMember (id) values (?)
update users for groupId 2
Hibernate: select groupmembe0_.id as id1_0_0_ from GroupMember groupmembe0_ where groupmembe0_.id=?
Hibernate: select groupmembe0_.groupList_id as groupLis1_1_0_, groupmembe0_.groupMemberList_id as groupMem2_1_0_, user1_.id as id1_4_1_ from GroupMember_User groupmembe0_ inner join User user1_ on groupmembe0_.groupMemberList_id=user1_.id where groupmembe0_.groupList_id=?
Hibernate: select user0_.id as id1_4_0_ from User user0_ where user0_.id=?
Hibernate: insert into GroupMember_User (groupList_id, groupMemberList_id) values (?, ?)
update groups for userId 1 -- doesn't work, not owner of relationship
Hibernate: select user0_.id as id1_4_0_ from User user0_ where user0_.id=?
Hibernate: select groupmembe0_.id as id1_0_0_ from GroupMember groupmembe0_ where groupmembe0_.id=?
update groups for userId 1 -- works
Hibernate: select groupmembe0_.id as id1_0_0_ from GroupMember groupmembe0_ where groupmembe0_.id=?
Hibernate: select groupmembe0_.groupList_id as groupLis1_1_0_, groupmembe0_.groupMemberList_id as groupMem2_1_0_, user1_.id as id1_4_1_ from GroupMember_User groupmembe0_ inner join User user1_ on groupmembe0_.groupMemberList_id=user1_.id where groupmembe0_.groupList_id=?
Hibernate: delete from GroupMember_User where groupList_id=?
Hibernate: insert into GroupMember_User (groupList_id, groupMemberList_id) values (?, ?)
Hibernate: insert into GroupMember_User (groupList_id, groupMemberList_id) values (?, ?)