Questo è un problema piuttosto brutto in Hibernate e in realtà ORM in generale.
Quello che succede è che i molti join (di recupero) causano la creazione di un prodotto cartesiano piuttosto grande. Per sempre altri unisco nuove colonne e nuove righe appaiono nel risultato, portando ad un risultato 'quadrato' (abbastanza) grande.
Hibernate ha bisogno di distillare un grafico da questa tabella, ma non è abbastanza intelligente da abbinare le colonne giuste alle entità giuste.
E.g.
supponiamo di avere il risultato
A B C
A B D
che deve diventare:
A
|
B
/\
C D
Hibernate poteva dedurre dalle chiavi primarie e qualche magia di codifica, che cosa il grafico deve essere, ma in pratica ha bisogno di aiuto esplicito per tirarlo fuori.
Un modo per farlo è specificando lo specifico Hibernate o lo standard JPA @OrderColumn
sulle relazioni.
E.g.
@Entity
public class Question {
@ManyToMany
@JoinTable(
name = "question_to_answer",
joinColumns = @JoinColumn(name = "question_id"),
inverseJoinColumns = @JoinColumn(name = "answer_id")
)
@IndexColumn(name = "answer_order")
private List<Answer> answers;
// ...
}
In questo esempio sto utilizzando una tabella di aderire, con una colonna in più answer_order
. Tramite questa colonna, che ha un numero sequenziale unico per ogni relazione domanda/risposta, Hibernate può distinguere le voci nella tabella dei risultati e creare il grafico oggetto richiesto.
Una nota btw, se riguarda più di alcune entità, l'utilizzo di così tanti join desiderosi può potenzialmente portare a un set di risultati molto più ampio di quanto si possa pensare in base al numero di entità coinvolte.
Ulteriori approfondimenti:
fonte
2012-11-11 20:30:34
Va notato che '@ IndexColumn' è ormai deprecato (attualmente usando Hibernate 5.2.4.Final) – JRSofty