Olá a todos, estou com o seguinte problema:
Tenho duas entidades, User e Role, com um relacionamento NxM bidirecional. A entidade “chefe” é a User.
Quando adiciono um role a um user e salvo o user, uma linha na tabela do relacionamento é criada.
Mas quando adiciono um user a um role a relação não é estabelecida.
Preciso que seja desse jeito pois terei duas telas, uma para detalhes do usuário e outra pra detalhes do role.
Na tela do usuário pode-se definir quais roles ele possui e na tela de roles pode-se definir quais users são membros daquela role.
Não sei se fui muito claro. Talvez um pouco de código ajude:
Entidade User:
@Entity @Table(name = "AC_USER") @SequenceGenerator(name="SEQ_USER", allocationSize=1)
public class User implements Serializable {
@Id @GeneratedValue(generator="SEQ_USER") @Column(name = "ID_USER")
private Integer id;
private String firstName;
private String lastName;
private String userName;
private String password;
@ManyToMany(cascade=CascadeType.REFRESH)
@JoinTable(name="AC_USER_ROLE", uniqueConstraints = @UniqueConstraint(columnNames={"ID_USER", "ID_ROLE"}),
joinColumns = {@JoinColumn(name="ID_USER", referencedColumnName="ID_USER", nullable=false)},
inverseJoinColumns = {@JoinColumn(name="ID_ROLE", referencedColumnName="ID_ROLE", nullable=false)})
private List<Role> roles;
Entidade Role:
@Entity @Table(name = "AC_ROLE") @SequenceGenerator(name="SEQ_ROLE", allocationSize=1)
public class Role implements Serializable {
@Id @GeneratedValue(generator="SEQ_ROLE") @Column(name = "ID_ROLE")
private Integer id;
private String name;
private String description;
@ManyToMany(mappedBy="roles")
private List<User> users;
Para testar:
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("TesteJpaPU");
EntityManager em = emf.createEntityManager();
User user = new User("User", "", "user", "123");
Role role = new Role("Admin", "");
em.getTransaction().begin();
// Assim funciona
em.persist(role);
user.setRoles(new ArrayList<Role>());
user.getRoles().add(role);
em.persist(user);
// Assim não funciona
em.persist(user);
role.setUsers(new ArrayList<User>());
role.getUsers().add(user);
em.persist(role);
em.getTransaction().commit();
em.close();
emf.close();
}
Eaí? O que quero fazer é possível?