我Entity下面有两个…
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用下面的方法有时…
User
Group
方法#1
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; }
方法#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; }
第一种方法可以正常工作,但第二种则不能。但是,当我将“ join table从” Group.class移至“ User.class第二”方法时,效果很好,而不是第一个。
join table
Group.class
User.class
问题是一个Owning Entity问题。
Owning Entity
假设它Staff是的子类User,那么您的问题是关系中只有一方是拥有实体。将mappedBy = "groupMemberList"使得Group实体所属的实体,因此仅改变该实体被持久化。这意味着,你必须更新groupMemberList在Group这两种情况下的实体。如果您有一个“ a”的组列表,User则必须遍历该组列表并将其添加User到其中。该groupList在User仅用于检索。
Staff
mappedBy = "groupMemberList"
groupMemberList
groupList
给定User和GroupMember实体:
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 (?, ?)