为了账号安全,请及时绑定邮箱和手机立即绑定

更新 JPA 或 Hibernate 中的多对多关系

更新 JPA 或 Hibernate 中的多对多关系

倚天杖 2021-09-03 13:24:12
我有两个Entity像下面...@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}我想User有时和Group有时使用以下方法更新...方法#1public boolean updateGroup(Long groupId, List<Staff> groupMemberList) {    Group group = hibernateTemplate.get(Group.class, groupId);    group.setGroupMemberList(groupMemberList);    hibernateTemplate.merge(group); // Group updated with the users    return true;}方法#2public 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;}第一种方法效果很好,但第二种方法不行。但是当我join table从第二个方法移动Group.class到User.class第二个方法时工作正常,而不是第一个。
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

问题是一个Owning Entity问题。


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


给定User和GroupMember实体:


@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();

提供以下 SQL 输出:


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 (?, ?)


查看完整回答
反对 回复 2021-09-03
  • 1 回答
  • 0 关注
  • 214 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信