In my application I have two table, Group and Role, that are related between them with a @ManyToMany relationsheep. Since each Group can have many Roles and each Role can have many Groups.
The first one:
@Table(name = "groups")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Groups {
private Set<Role> roles = new HashSet<Role>();
@ManyToMany(
fetch = FetchType.EAGER,
cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(name = "group_role", joinColumns = @JoinColumn(name = "group_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
@IndexedEmbedded
public Set<Role> getRoles() {
return this.roles;
}
}
And the Role class is:
@Entity
@Table(name = "role")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Role {
/** Field mapping. */
private Set<Groups> groups = new HashSet<Groups>();
@ManyToMany(
fetch = FetchType.EAGER
//,cascade = { CascadeType.PERSIST}
)
@JoinTable(name = "group_role", joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name ="group_id" ))
public Set<Groups> getGroups() {
return this.groups;
}
}
I want to add a role to a group, that means adding a record to the group_role table.
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void saveRoleToGroup(Group group,Role... roles) {
groups.setRoles(roles);
groupsDAO.merge(groups);
LOG.debug("message2");
}
It works and saves, just executing to the merge takes him 1 minutes!
watching the sql statment that are printed to the log, shows that after executing the follwing statment, there is a minute before closing the session.
15:55:56,875 DEBUG - message2
15:55:56,906 DEBUG (SQLStatementLogger.java:111) - update groups set version=?, company_id=?, name=? where id=? and version=?
15:55:56,906 DEBUG (SQLStatementLogger.java:111) - insert into group_role (group_id, role_id) values (?, ?)
15:57:10,171 DEBUG - end
The end statement comes from the calling method.
Why the simple insert statement consumes so much time (1 min)?