Here is the situation : I have 2 entities Trader and client : - one client is associated to one trader - one trader could be associated to one or many clients while deleting a trader using EntityManager.remove(t) then commit, all the clients releated to that trader are deleted automatically. it's fine because it's cascade deleting. Question :
1 - How can i remove my trader and reaffect its client to an other one ?
2 - Does the solution resides in desabling the cascade effect in mySQL or it resides in both entityManager and MySQL ? thx u very much for any help.
Client Entity
public class Client implements Serializable {
@Transient
private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id_client")
private Integer idClient;
@Column(name = "id_portefeuille")
private Integer idPortefeuille;
@Column(name = "id_entreprise")
private Integer idEntreprise;
@Column(name = "id_trader")
private Integer idTrader;
//other attributes
@JoinColumn(name = "id_trader", referencedColumnName = "id_trader", updatable = false, insertable = false)
@ManyToOne
private Trader idTrader2;
//getters and setters
Trader Entity
public class Trader implements Serializable {
@Transient
private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id_trader")
private Integer idTrader;
@Column(name = "nom")
//other attributes
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idTrader2")
private Collection<Client> clientCollection;
//getters and setters
Main code
//Getting The trader selected in a JTable
Trader t = traderList.get(tableTrader.getSelectedRow());
for (Iterator<Client> it = t.getClientCollection().iterator(); it.hasNext(); ) {
//Getting the Clients releated to this trader
Client c = it.next();
//Affecting the client to an other trader
// i chose an existing one randomly
c.setIdTrader2(traderList.get(2));
traderList.get(2).getClientCollection().add(c);
it.remove();
}
entityManager.flush();
entityManager.remove(t);
}
There should be no delete in cascade configured, neither in MySQL not in the entity mapping. The method would thus look like this (assuming there is a bidirectional association, and thet getClients()
returns the persistent list directly, without making a defensive copy or wrapping it into an unmodified proxy):
public void deletedTrader(Trader toDelete, Trader newAssignedTrader) {
for (Iterator<Client> it = toDelete.getClients().iterator(); it.hasNext(); ) {
Client c = it.next();
c.setTrader(newAssignedTrader);
newAssignedTrader.getClients().add(c);
it.remove();
}
em.remove(toDelete);
}