2010-07-14 16 views
5

Il mio modello di dati è composto da scuole e studenti. Gli studenti hanno un FK per la scuola a cui appartengono. Non capisco perché la raccolta contenga duplicati, ad esempio Joe, Joe, Mary, Mary, Tom, Tom, ecc. La query SQL generata da Hibernate è corretta e non restituisce duplicati. Potrei implementare un hack per filtrare i duplicati, ma non sono ancora pronto per vivere con una finestra rotta;) Ho provato ad incollare i pezzi di codice rilevanti di seguito. Qualsiasi aiuto molto apprezzato!Hibernate/JPA: duplicati nella raccolta figli

// SchoolJpa 

@OneToMany (
    mappedBy = "school", 
    targetEntity = StudentJpa.class, 
    fetch = FetchType.LAZY, 
    cascade = CascadeType.ALL 
) 
@Override 
public List<Student> getStudentsInternal() { 
    return super.getStudentsInternal(); 
} 

// SchoolImpl 

private List<Student> students = new ArrayList<Student>(); 

public List<Student> getStudents() { 
    return Collections.unmodifiableList(students); 
} 

public List<Student> getStudentsInternal() { 
    return students; 
} 

public void setStudentsInternal(List<Students> students) { 
    this.students = students; 
} 
+0

Qual è il codice specifico che stai utilizzando per recuperare gli oggetti? Hibernate ha alcuni problemi noti con determinati tipi di HQL che attiveranno la duplicazione come questa. – Jherico

risposta

1

difficile dire dal pezzo di codice, ma:

  1. differenza set, elenca in genere consentire gli elementi duplicati (sì, ho notato che hai detto la query non restituisce i duplicati, ma volevo segnalare che forse non stai utilizzando il giusto tipo di raccolta).
  2. Assicurati di implementare correttamente equals/hashCode (sospetto un problema a questo livello).

In realtà, è possibile visualizzare l'intera mappatura? Non sono sicuro di capire perché hai diversi getter e setter sullo stesso campo.

+0

equals/hashCode sono correttamente implementati. L'uso di un Set risolve il problema, ma lo considero un trucco. setStudentsInternal/getStudentsInternal è solo per Hibernate (questi metodi non sono definiti sull'interfaccia) - la collezione è incapsulata con addStudent, removeStudent e getStudents che restituisce una collezione non modificabile. – Francois

+0

@Francois: l'uso di un 'Set' non è un hack ma potrebbe nascondere la vera causa del problema (è forse il motivo per cui lo chiami) ma non posso aggiungere altro se non fornisci altro codice (le mappature esatte). Inoltre, fornire il contenuto della tabella e la query/query eseguite sarebbe d'aiuto. –

13

La mia ipotesi è che si disponga di un FetchType.EAGER o di un'altra mappatura in School che causerà l'emissione di una query di outer join da Hibernate, che genererà duplicati nell'elenco.

Il tipo di commutazione su SET funziona perché un set si disattiva naturalmente in base all'uguaglianza, quindi i duplicati restituiti dalla query di outer join vengono persi.

Un molto più approfondita spiegazione Eran Medan disponibili here:

0

me pensa che si sta aggiungendo cose alla collezione che esistono già per quell'oggetto. Non posso essere sicuro di non vedere il codice in cui aggiungi roba alla collezione di Studenti della Scuola, ma sarebbe la mia ipotesi.

Problemi correlati