问题是一个
Owning Entity问题。
假设它
Staff是的子类
User,那么您的问题是关系中只有一方是拥有实体。将
mappedBy ="groupMemberList"使得
Group实体所属的实体,因此仅改变该实体被持久化。这意味着,你必须更新
groupMemberList在
Group这两种情况下的实体。如果您有一个“
a”的组列表,
User则必须遍历该组列表并将其添加
User到其中。该
groupList在
User仅用于检索。
给定
User和
GroupMember实体:
@Entitypublic class User { @Id @GeneratedValue private Long id; @ManyToMany(mappedBy = "groupMemberList") private List<GroupMember> groupList;@Entitypublic 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 2System.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 relationshipSystem.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 -- worksSystem.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 2Hibernate: 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 relationshipHibernate: 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 -- worksHibernate: 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 (?, ?)



