ho molti a molti relazione tra il Cliente e BusinessUnit:JPA molti a molti fondersi sul proprietario trigger DELETE sul tavolo unirsi
public class Customer extends AbstractEntity {
@JoinTable(name = "CUS_BUS_UNITS",
joinColumns = {
@JoinColumn(name = "CUS_ID", referencedColumnName = "CUS_ID")},
inverseJoinColumns = {
@JoinColumn(name = "BUS_ID", referencedColumnName = "BUS_ID")})
@ManyToMany
private Collection<BusinessUnit> businessUnits;
}
public class BusinessUnit extends AbstractEntity {
@ManyToMany(mappedBy = "businessUnits")
private Collection<Customer> customers;
}
quando chiamo entityManager.merge (cliente); su un cliente (già nel DB, non alterato) Vedo questi due comandi SQL in registro:
Hibernate: CLIENTI aggiornamento dell'insieme CUS_DESCR = ?, CUS_NAME = ?, CUS_ENABLED =? dove CUS_ID =? Ibernazione: elimina da CUS_BUS_UNITS dove CUS_ID =?
Perché è in ibernazione il tentativo di eliminare un record dalla tabella di join? Ho bisogno solo di aggiornare il record del cliente e possibilmente i record nella tabella di join - dipende dal fatto che ho aggiunto o rimosso business unit sul cliente. Le unità aziendali non dovrebbero essere aggiornate, cancellate o inserite.
EDIT: miei pari/hashCode sono (definiti in AbstractEntity):
public int hashCode() {
if (getId() != null) {
return getId().hashCode();
}
return super.hashCode();
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
AbstractEntity other = (AbstractEntity) obj;
if (getId() == null || other.getId() == null) {
return false;
}
if (!getId().equals(other.getId())) {
return false;
}
return true;
}
EDIT 2 Converter per la forma:
@FacesConverter("businessUnitConverter")
public class BusinessUnitConverter implements Converter {
/**
* {@inheritDoc}
*/
@Override
public String getAsString(FacesContext context, UIComponent component, Object object) {
return ((BusinessUnit) object).getId().toString();
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
BusinessUnit businessUnit = new BusinessUnit();
businessUnit.setId(Long.parseLong(value));
return businessUnit;
}
}
Do Customer e BusinessUnit dispongono entrambi di metodi hashcode e uguali corretti? –
L'ho eliminato per SO - ma hanno un padre astratto con quei metodi che usano l'id di entità per equals/hashcode. – DominikM
Quando si aggiunge un nuovo ibernazione 'BusinessUnit' si imposta l'id e questo cambia l''" identità "dell'oggetto con l'implementazione' equals', che potrebbe causare confusione. Puoi provare senza 'equals' e' hashCode' e vedere se il problema esiste ancora? –