2011-05-17 13 views
7

Estoy tratando de usar un mapa como tipo para una de las propiedades de mis modelos. Tomemos estas dos clases, por ejemplo:Usar el mapa como propiedad del modelo en Reproducir

@Entity 
public class Foo extends Model { 

    @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL) 
    @MapKey(name = "name") 
    public Map<String, Bar> bars; 

    public String name; 

} 

@Entity 
public class Bar extends Model { 

    @ManyToOne 
    public Foo foo; 

    public String name; 
} 

Muy simplificado, por supuesto, pero esa es la idea básica. Entonces, lo que estoy tratando de lograr es obtener un mapa con Barras como valores y los nombres como sus claves en Foo.

Ahora quiero utilizar accesorio para cargar algunos datos de este archivo YAML:

Foo(foo1): 
    name: Foo1 

Foo(foo2): 
    name: Foo2 

Bar(bar1): 
    name: Bar1 
    foo: foo1 

Bar(bar2): 
    name: Bar2 
    foo: foo1 

No hay problemas hasta ahora, esto funciona como un encanto. Ahora bien, si trato de cambiar a bar2 foo: foo2, consigo este Excepción:

play.exceptions.JavaExecutionException: Cannot load fixture initial-data.yml: org.hibernate.HibernateException: Found two representations of same collection: models.Foo.bars 
    at play.jobs.Job.call(Job.java:166) 
    at Invocation.Job(Play!) 
Caused by: java.lang.RuntimeException: Cannot load fixture initial-data.yml: org.hibernate.HibernateException: Found two representations of same collection: models.Foo.bars 
    at play.test.Fixtures.loadModels(Fixtures.java:221) 
    at jobs.Bootstrap.doJob(Bootstrap.java:18) 
    at play.jobs.Job.doJobWithResult(Job.java:55) 
    at play.jobs.Job.call(Job.java:157) 
    ... 1 more 
Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: Found two representations of same collection: models.Foo.bars 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:798) 
    at play.db.jpa.JPABase._save(JPABase.java:47) 
    at play.test.Fixtures.loadModels(Fixtures.java:205) 
    ... 4 more 
Caused by: org.hibernate.HibernateException: Found two representations of same collection: models.Foo.bars 
    at org.hibernate.engine.Collections.processReachableCollection(Collections.java:175) 
    at org.hibernate.event.def.FlushVisitor.processCollection(FlushVisitor.java:60) 
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:122) 
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:83) 
    at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:77) 
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:165) 
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:240) 
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795) 
    ... 6 more  

at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99) 
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795) 
... 6 more 

Por supuesto Traté de google, pero no pude encontrar ninguna solución para mi caso. Alguna idea sobre eso? Curiosamente, puedo ir y cambiar los valores en la base de datos después y asignar a bar2 foo1 y todo funciona perfectamente bien, así que no puedo ser demasiado mal ...

ayuda sería muy apreciada :)

mejor, kalarzo

+0

Puede intentar publicar esta pregunta para jugar al grupo de google de framework en http://groups.google.com/group/play-framework, ellos son muy receptivos ... – opensas

+0

Le hice esta pregunta "muy similar": aquí] (http://stackoverflow.com/questions/8508068/how-to-debug-found-two-representations-of-same-collection). Consulte [lo que funcionó para mí] (http://stackoverflow.com/a/8521408/11236). – ripper234

Respuesta

-1

Eliminar el:

@MapKey(name = "name") 
+0

Supongo que el usuario lo puso allí a propósito. – pottedmeat

2

he probado el código de hoy y funcionó sin problemas. ¿Qué versión de juego usas? Yo uso 1.2.3.

Quizás el complemento association resuelva ese problema, porque eso es lo que estoy usando en segundo plano. Háganme saber si una actualización lo ayudó.

Sigue procedimiento de instalación del módulo de reproducción estándar:

play install associations 

Añada la siguiente línea a su dependencies.yml sustitución de 1,0 con la versión deseada:

require: 
    - play -> associations 1.0 
0

que tenían el mismo problema en v1. 2.3 con accesorios. Extrañamente, si no definí un dispositivo debajo del que tenía la relación bidireccional Map OneToMany, no hubo ningún problema. También tuve un problema en uno de mis controladores si no configuré la relación bidireccional por completo. Parece estar directamente relacionado con el uso de un mapa en una relación OneToMany bidireccional. Cambié a un Set y el problema desapareció. Al final, logré resolver la situación sin volver a un Conjunto actualizando a v1.2.4RC2. Eché un vistazo rápido a la lista de cambios en v1.2.4RC2 pero no pude encontrar nada que mencionara directamente la solución de este problema, pero algo debe haberse resuelto.

Cuestiones relacionadas