Ho trovato severalquestionsabout questo, ma nessuno con una spiegazione completa del problema, e come eseguire il debug - le risposte sono tutte aneddotiche.Come eseguire il debug di "Trovato due rappresentazioni della stessa collezione"?
Il problema è che in un gioco 1.2.4 test di APP, sto ottenendo questa eccezione quando ho save()
un modello:
org.hibernate.HibernateException: Trovato due rappresentazioni della stessa collezione : modelli .Position.projects
Vorrei sapere:
- c'è una documentazione di questo problema, in generale, un collegato a Play? Il problema è in ibernazione, tuttavia molti dei risultati di Google su questo sono all'interno delle app Play.
- Quali sono alcune best practice di base per evitare questo problema?
- È causato da Play? O qualcosa che sto sbagliando?
- Come risolvere nel mio caso specifico?
Here is a reproduction of the problem on github. Ho quattro entità:
@Entity
public class Person extends Model {
public String name;
@OneToMany(cascade = CascadeType.ALL)
public List<Position> positions;
}
@Entity
public class Position extends Model {
public Position(){}
public Position(Company companies) {
this.companies = companies;
this.projects = new ArrayList<Project>();
}
@OneToOne
public Company companies;
@ManyToOne
public Person person;
@OneToMany
public List<Project> projects;
}
@Entity
public class Company extends Model {
public String name;
}
@Entity
public class Project extends Model {
public Project(){}
public Project(String field, String status){
this.theField = field;
this.status = status;
}
@ManyToOne
public Position position;
public String theField;
public String status;
}
e il mio codice di persistenza:
Company facebook = new Company();
facebook.name = "Facebook";
facebook.save();
Company twitter = new Company();
twitter.name = "Twitter";
twitter.save();
Person joe = new Person();
joe.name = "Joe";
joe.save();
joe.positions = new ArrayList<Position>();
Position joeAtFacebook = new Position(facebook);
joeAtFacebook.projects.add(new Project("Stream", "Architect"));
joeAtFacebook.projects.add(new Project("Messages", "Lead QA"));
joe.positions.add(joeAtFacebook);
Position joeAtTwitter = new Position(twitter);
joeAtTwitter.projects.add(new Project("Steal stuff from Facebook", "CEO"));
joe.positions.add(joeAtTwitter);
joe.save();
A proposito, ho provato ad aggiungere la Play associations module come una sola persona ha suggerito, e does't sembra aiutare.
vedo che, infatti, che le tabelle che vengono create sono duplicati in un certo senso:
Ho sia un tavolo person_position
e un position table
, dove entrambi contengono campi simili: person_position
contiene un Person_id
e positions_id
, mentre il tavolo position
contenere id
(che indica l'ID di posizione), person_id
e companies_id
. Quindi capisco che una sorta di ridondanza involontaria è stata creata dalla mia definizione del modello, ma non capisco davvero come risolverlo.
ho pensato che questo potrebbe essere correlato al mappature bidirezionali, ma qui è una branch where the model is uni-directional (ho tolto alcuni back-riferimenti) - e il problema si verifica ancora.
la mia ipotesi - problema a cascata. aggiungi una posizione e la posizione aggiunge due progetti, quindi joe.save() potrebbe causare l'aggiunta della posizione due volte. Gioca con le opzioni Cascade e riporta nuovamente :) –
@KenEgozi - le opzioni a cascata influiscono su come vengono generate le mie tabelle? Perché ho una duplicazione nella struttura della tabella stessa ... (Ho messo i dettagli nella domanda) – ripper234
@KenEgozi - risolto aggiornando la versione di ibernazione - vedi la mia risposta. Grazie. – ripper234