Hi,

The good news is i solved my problem, the bad one is its still much code needed to update a bi-directional ManyToMany relationship correctly. But it's in the nature of things.

http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

I misunderstand JPA in some ways, what i have learned is that i have to update both sides of the relationship, manually.

Here the working code:

public void updateUser(User editedUser)
{
  User managedUser = em.find(User.class, editedUser.getId());

  List<Group> groupsOfManagedUser = managedUser.getGroups();
  List<Group> groupsOfEditedUser = editedUser.getGroups();

List<Group> addedGroups = determineAddedGroups(groupsOfEditedUser, groupsOfManagedUser); List<Group> removedGroups = determineRemovedGroups(groupsOfEditedUser, groupsOfManagedUser);

  for (Group addedGroup : addedGroups)
  {
    Group managedGroup = em.find(Group.class, addedGroup.getId());
    managedGroup.getUsers().add(managedUser);
    managedUser.getGroups().add(managedGroup);
  }

  for (Group managedGroup : removedGroups)
  {
    int userIndex = findUser(managedGroup.getUsers(), editedUser.getId());
    managedGroup.getUsers().remove(userIndex);

    int groupIndex = findGroup(groupsOfManagedUser, managedGroup.getId());
    groupsOfManagedUser.remove(groupIndex);
  }

  updateOtherUserProperties(managedUser, editedUser);
}

Reply via email to