Estou precisando de uma ajuda aqui, vamos ver se consigo explicar o meu problema. Basicamente, tenho uma entidade User que tem uma relacao de N para N com SecurityRoles. Fisicamente tenho uma terceira tabela para a relacao.
Esta a a entity User
package com.tabajara.tool.entity;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
@Entity
@Table(name = "EN_USER")
@NamedQueries({
@NamedQuery(name = "getUserByLogin", query = "select u from User u where u.login = :login"),
@NamedQuery(name = "getUserByLoginPassword",
query = "select u from User u where u.login = :login and u.password = :password"),
@NamedQuery(name = "getUserById", query = "select u from User u where u.id = :id") })
public class User extends BaseEntity {
/**
*
*/
private static final long serialVersionUID = 3496251842591492254L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "GENTAB")
@TableGenerator(name = "GENTAB", table = "ID_GEN", allocationSize = 1, pkColumnName = "ID_NAME",
valueColumnName = "ID_VAL", pkColumnValue = "ID_USER")
private Integer id;
private Integer status;
private String login;
private String password;
private String name;
@ManyToMany(targetEntity = com.tabajara.tool.entity.SecurityRole.class,
cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name = "EN_SECURITY_ROLE_USER",
joinColumns = @JoinColumn(name = "ID_USER"),
inverseJoinColumns = @JoinColumn(name = "ID_SECURITY_ROLE"))
private List<SecurityRole> securityRoles = new ArrayList<SecurityRole>();
@OneToOne(mappedBy = "user", fetch = FetchType.LAZY)
private Profile profile;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id
* the id to set
*/
public void setId(final Integer id) {
this.id = id;
}
/**
* @return the status
*/
public Integer getStatus() {
return status;
}
/**
* @param status
* the status to set
*/
public void setStatus(final Integer status) {
this.status = status;
}
/**
* @return the login
*/
public String getLogin() {
return login;
}
/**
* @param login
* the login to set
*/
public void setLogin(final String login) {
this.login = login;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password
* the password to set
*/
public void setPassword(final String password) {
this.password = password;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name
* the name to set
*/
public void setName(final String name) {
this.name = name;
}
/**
* @return the email
*/
public String getEmail() {
return email;
}
/**
* @param email
* the email to set
*/
public void setEmail(final String email) {
this.email = email;
}
/**
* @return the registerDate
*/
public Date getRegisterDate() {
return registerDate;
}
/**
* @param registerDate
* the registerDate to set
*/
public void setRegisterDate(final Date registerDate) {
this.registerDate = registerDate;
}
/**
* @return the serialversionuid
*/
public static long getSerialversionuid() {
return serialVersionUID;
}
private String email;
@Column(name = "REGISTER_DATE")
private Date registerDate;
/**
* @return the profile
*/
public Profile getProfile() {
return profile;
}
/**
* @param profile
* the profile to set
*/
public void setProfile(final Profile profile) {
this.profile = profile;
}
public List<SecurityRole> getSecurityRoles() {
return securityRoles;
}
public void setSecurityRoles(List<SecurityRole> securityRoles) {
this.securityRoles = securityRoles;
}
}
SecurityRole
package com.tabajara.tool.entity;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
@Entity
@Table(name = "EN_SECURITY_ROLE")
@NamedQueries({ @NamedQuery(name = "getSecurityRoleById", query = "select sr from SecurityRole sr where sr.id = :id")})
public class SecurityRole extends BaseEntity {
/**
*
*/
private static final long serialVersionUID = 7838467440647559989L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "GENTAB")
@TableGenerator(name = "GENTAB", table = "ID_GEN", allocationSize = 1, pkColumnName = "ID_NAME",
valueColumnName = "ID_VAL", pkColumnValue = "ID_SECURITY_ROLE")
private Integer id;
@Column(name = "SECURITY_ROLE")
private String role;
@Column(name = "DESCRIPTION")
private String description;
@ManyToMany(mappedBy = "securityRoles", targetEntity = User.class)
private List<User> users = new ArrayList<User>();
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Estava tudo funcionando, ate eu adicionar essa nova relacao @ManyToMany.
Quando executo meu teste
@Test
public void testSave() {
User u = new User();
try {
u.setEmail("teste@yahoo.com.br");
u.setLogin("UserTest_User2");
u.setName("UserTest_User2");
u.setPassword("123456");
u.setStatus(0);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(u);
em.getTransaction().commit();
} catch (BusinessException e) {
} catch (Exception e) {
TestCase.fail();
} finally {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Query q = em
.createQuery("delete from User u where u.name = :nomeTeste");
q.setParameter("nomeTeste", "UserTest_User2");
q.executeUpdate();
em.getTransaction().commit();
}
}
O Hibernate trava, ele chega a imprimir o insert
Hibernate: insert into EN_USER (email, login, name, password, REGISTER_DATE, status, id) values (?, ?, ?, ?, ?, ?, ?)
mas fica travado na linha
em.getTransaction().commit();
Alguém sabe o que pode estar acontecendo? e como corrigir?