Hibernate ManyToMany Save, SaveOrUpdate And Delete Operations
03-05-2015In Hibernate ManyToMany relationship, save or saveOrUpdate operations must be as follows:
User Entity
@ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL) @JoinTable( name = "UserRole_User", joinColumns = @JoinColumn(name = "userId", nullable = false, updatable = false), inverseJoinColumns = @JoinColumn(name = "userRoleId", nullable = false, updatable = false) ) private List<UserRole> userRoleList=new ArrayList<UserRole>();In Line 1,
cascade
provides that when user is saved, an insert operation will be executed on UserRole_User
table automatically. CascadeType.ALL
contains INSERT, UPDATE, DELETE, REFRESH and DETACH
. If you want to only cascade INSERT statement, you can use CascadeType.PERSIST
In Line 4 and 5, userId and userRoleId are primary keys of User and UserRole entities, respectively. Also note that, userId is used in joinColumns attribute.
UserRole Entity
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "userRoleList") @JsonIgnore private List<User> userList;
Test Class
public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); User user = new User(); user.setUsername("myuce"); UserRole userRole=new UserRole(); userRole.setName("ROLE_ADMIN"); List<UserRole> userRoleList = new ArrayList<UserRole>(); userRoleList.add(userRole); user.setUserRoleList(userRoleList); session.save(user); session.getTransaction().commit(); }
Result:
Hibernate: insert into User (username,name,surname) values (?, ?, ?) Hibernate: update UserRole set role=? where userRoleId=? Hibernate: insert into UserRole_User (userId, userRoleId) values (?, ?)
Note: A cascade set to DELETE wouldn't delete the association between a userRole and a user when you delete a user. It would delete the groups themselves. To delete the association, you just have to remove all the groups from the collection of groups of the user before deleting the user:
@Override public boolean delete(Integer entityId) { User entity = (User) currentSession().get(daoType, entityId); if (entity != null) { entity.getUserRoleList().clear();//clear() method must b currentSession().delete(entity); return true; } else { return false; } }
Removing the groups from the users is what will delete the associations from the join table.