Sono molto nuovo per Spring e sto cercando di far funzionare una relazione molti-a-molti come mi aspetto. Le relazioni funzionano bene, le tabelle vengono create e i dati sono inseriti correttamente. Quello che mi aspetto è che quando svuoto un elenco (ad esempio, svuoto gli "utenti" di ArrayList da un oggetto di tipo "Gruppo"), mi aspetto che il sistema rimuova le relazioni dal database, ma non lo fa.Spring + JPA many to many relationship
Ho le seguenti classi:
@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>();
...
}
Ecco i DAO:
@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;
}
}
Ecco il metodo di prova:
@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!
}
sto facendo qualcosa di sbagliato o è qualcosa non è possibile fare?
Qualsiasi suggerimento è molto apprezzato.
Grazie!
hai provato ad aggiungere 'delete-orphan' al tuo attributo' a cascata '? – fasseg
Hai dichiarato 'IdTransferringMergeEventListener'? – axtavt
Non so se questa è la causa del problema, ma il metodo di salvataggio non dovrebbe restituire void. Dovrebbe restituire il risultato della chiamata di fusione. Prova a fare questa modifica e usa il gruppo restituito: 'g = groupDao.save (g);' –