2012-10-08 35 views
5

Tengo una relación de varios a varios si la tabla de enlaces tiene un campo adicional. Por lo tanto la relación está hecho con 2 relaciones de uno a muchos de acuerdo con por debajo de tutorial:Hibernar: fusionarse con resultados de muchos a muchos en StackOverflowError

http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/comment-page-1/#comment-122181

I tienen los 2 entidades, tercera entidad que define la tabla de enlace y constan de un campo de ID @Embeddable.

La relación se define como:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.compound", cascade = CascadeType.ALL) 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.structure", cascade = CascadeType.ALL) 

eran pk = el campo ID @Embeddable. Insertar y borrar funciona bien sin embargo cuando llamo

session.merge(compound); 

consigo un StackOverflowError y muestra que Hibernate es hacer toneladas de sentencias de selección de registro. Tenga en cuenta que la base de datos contiene exactamente 1 asociación, por ej. 1 compuesto que contiene 2 estructuras. Parece que la hibernación entra en un ciclo sin fin.

He visto esta solución también en http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-jpa/, pero ¿cómo se actualiza con esto?

+2

Tal vez está cargando sus tablas de muchos a muchos a través de la relación de muchos a muchos. Imagine las referencias 'A1'' B1'. 'B1' hace referencia a' A1' y 'A2'. 'A2' hace referencia a' B2'. Y así. Con cada cambio de un lado de la relación al otro, obtienes un nivel de pila adicional. – SpaceTrucker

+0

Persistir y cargar funciona pero al llamar a fusionar aparece el problema. –

+0

@SpaceTrucker, sin embargo, Merge debe gestionar las entidades visitadas por una sub-operación de fusión anterior. beginner_ por favor comparta sus entidades completas con un caso de prueba para que podamos ayudarlo mejor. –

Respuesta

3

Mi solución fue utilizar FetctType.EAGER en el lado propietario y FetchType.Lazy en el lado del niño y en las 2 relaciones ManyToOne en la tabla de enlaces. De esta manera, puedo cargar desde el lado propietario sin obtener LazyInitializationException y mergign funcionando como se espera.

0

I segunda respuesta de SpaceTuckker. No creo que Persist sea lo mismo que fusionar. Merge cargará el objeto antes de persistirlo. Persist no. Entonces, cuando llame a la combinación en mi humilde opinión, debe cargar la relación floja. Si llamas persiste, no es así.

También puede usar @ElementDependent para marcar las relaciones relacionadas @OneToMany como dependiendo de otra tabla. Esta fue la forma en que resolví la relación Muchos a Muchos con columnas adicionales en la tabla de unión.

+2

Sí, pero conseguir que la entidad funcione. Así que puedo persistir y en una sesión completamente diferente cargarlo y sin problemas. El problema solo ocurre en la fusión. La solución resultó ser agregar fetch = FetchType.LAZY a las relaciones ManyToOne en la clase de Id. Incrustable. –