Soy muy nuevo en Spring y estoy tratando de hacer que una relación de muchos a muchos funcione como espero. Las relaciones funcionan bien, las tablas se crean y los datos se insertan correctamente. Lo que espero es que cuando vacíe una Lista (es decir, vacíe los "usuarios" ArrayList de un objeto de tipo "Grupo"), espero que el sistema elimine las relaciones de la base de datos, pero no es así.Spring + JPA relación muchos a muchos
Tengo las siguientes clases:
@Entity
@Table(name = "`group`")
public class Group
{
@Id
@GeneratedValue
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(
name = "`user_has_group`",
joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")
)
private List<User> users = new ArrayList<User>();
...
}
@Entity
@Table(name = "`user`")
public class User
{
@Id
@GeneratedValue
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@ManyToMany(mappedBy = "users")
private List<Group> groups = new ArrayList<Group>();
...
}
Éstos son los DAOs:
@Repository
public class GroupJpaDao implements GroupDao
{
private EntityManager em;
@Transactional
public void save(Group group)
{
this.em.merge(group);
}
...
@PersistenceContext
void setEntityManager(EntityManager entityManager)
{
this.em = entityManager;
}
}
@Repository
public class UserJpaDao implements UserDao
{
private EntityManager em;
@Transactional
public void save(User user)
{
this.em.merge(user);
}
...
@PersistenceContext
void setEntityManager(EntityManager entityManager)
{
this.em = entityManager;
}
}
Aquí es el método de ensayo:
@Test
public void test()
{
Group g = new Group();
g.setName("Test group");
groupDao.save(g); // Works fine - inserts the group into the database
User u = new User();
u.setName("Test user");
userDao.save(u); // Works fine - inserts the user into the database
g.addUser(u);
groupDao.save(g); // Works fine - adds the many-to-many relationship into the database
g.removeAllUsers();
groupDao.save(g); // Doesn't work - I'm expecting it to remove all the related relationships from the database but it doesn't!
}
estoy haciendo algo mal o es algo que no es posible hacer?
Cualquier pista es muy apreciada.
¡Gracias!
¿Intentó agregar 'delete-orphan' a su atributo' cascada'? – fasseg
¿Has declarado 'IdTransferringMergeEventListener'? – axtavt
No sé si esa es la causa del problema, pero el método de guardar no debe volverse vacío. Debería devolver el resultado de la llamada de combinación. Intente hacer este cambio y utilizando el grupo devuelto: 'g = groupDao.save (g);' –