He encontrado severalquestionsabout esto, pero ninguno con una explicación completa del problema, y cómo depurarlo - las respuestas son todas anecdóticas.Cómo depurar "¿Encontré dos representaciones de la misma colección"?
El problema es que en una prueba de APP Juego 1.2.4, estoy recibiendo esta excepción cuando I save()
un modelo:
org.hibernate.HibernateException: Encontrado dos representaciones de la misma colección : modelos .Position.projects
me gustaría saber:
- ¿existe una documentación de este problema, en general, de la ONU relacionado con Play? El problema está en hibernación, sin embargo, muchos de los resultados de Google sobre esto están dentro de las aplicaciones Play.
- ¿Cuáles son algunas de las mejores prácticas básicas para evitar este problema?
- ¿Es causado por Play? O algo que estoy haciendo mal?
- ¿Cómo resolver en mi caso específico?
Here is a reproduction of the problem on github. Tengo cuatro entidades:
@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;
}
Y mi código de persistencia:
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();
Por cierto, he intentado añadir el Play associations module como una persona sugirió, y does't parece ayudar.
veo que, efectivamente, que las tablas que se crean son duplicado en un sentido:
tengo tanto una mesa person_position
y una position table
, donde ambos contienen campos similares: person_position
contiene una Person_id
y positions_id
, mientras que la mesa position
contiene id
(es decir, identificación de posición), person_id
y companies_id
. Así que entiendo que la definición de mi modelo crea algún tipo de redundancia involuntaria, pero realmente no entiendo cómo resolverlo.
Pensé que esto podría estar relacionado con las asignaciones bidireccionales, pero aquí está un branch where the model is uni-directional (eliminé algunas referencias) y el problema persiste.
my guess - cascading problem. agrega una Posición, y la posición agrega dos proyectos, entonces joe.save() puede causar que se agregue la posición dos veces. Juega con las opciones de Cascade e informa de nuevo :) –
@KenEgozi - ¿Las opciones en cascada afectan cómo se generan mis tablas? Debido a que tengo una duplicación en la estructura de la tabla en sí ... (Puse los detalles en la pregunta) – ripper234
@KenEgozi - resuelto al actualizar la versión de hibernación - ver mi respuesta. Gracias. – ripper234