2013-02-15 9 views
6

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; 
    } 

} 
+0

Do Customer e BusinessUnit dispongono entrambi di metodi hashcode e uguali corretti? –

+0

L'ho eliminato per SO - ma hanno un padre astratto con quei metodi che usano l'id di entità per equals/hashcode. – DominikM

+0

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? –

risposta