在JPA或Hibernate中更新ManyToMany关系

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用下面的方法有时…

public 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;

}

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;

}

第一种方法可以正常工作,但第二种则不能。但是,当我将“ join table从” Group.class移至“

User.class第二”方法时,效果很好,而不是第一个。

回答:

问题是一个Owning Entity问题。

假设它Staff是的子类User,那么您的问题是关系中只有一方是拥有实体。将mappedBy =

"groupMemberList"使得Group实体所属的实体,因此仅改变该实体被持久化。这意味着,你必须更新groupMemberListGroup这两种情况下的实体。如果您有一个“

a”的组列表,User则必须遍历该组列表并将其添加User到其中。该groupListUser仅用于检索。

给定UserGroupMember实体:

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

以上是 在JPA或Hibernate中更新ManyToMany关系 的全部内容, 来源链接: utcz.com/qa/432216.html

回到顶部