2012-02-20 15 views
12

Estoy teniendo algunos problemas para obtener una asociación bidireccional de uno a muchos que trabaje con JoinTables. Esto es lo que tengo:one-to-many bidireccional con

Clase A:

@OneToMany 
@JoinTable(name="join_table", 
    JoinColumns={@JoinColumn(name="a_id")}, 
    inverseJoinColumns={@JoinColumn(name="b_id")} 
) 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
public Set<B> getBs() { 
    return bs; 
} 

Clase B:

@ManyToOne 
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="b_id", insertable=false,updatable=false)}, 
    inverseJoinColumns={@JoinColumn(name="a_id", insertable=false,updatable=false)}) 
public A getA() { 
    return a; 
} 

Si se crea una instancia de A y B, añadir la instancia de B a A y guardar. Funciona. Pero cuando recargo la instancia de A e intento acceder al conjunto de Bs arroja un LazyInitializationError con el mensaje "acceso ilegal a la carga de la colección".

¿Dónde me estoy equivocando aquí? :) ¿Alguien puede señalarme un ejemplo de asociación bidireccional que utiliza una tabla de unión? Y donde la propiedad se mantiene en la Clase A, he buscado la documentación en hibernate.org pero parece que no puedo encontrarla.

-Daniel

+0

¿Por qué está utilizando una tabla de combinación diferente en su entidad derivada (B)? – Perception

+0

lo siento, he actualizado la pregunta. La razón fue que modifiqué las dos clases reales para el ejemplo (renombrándolas A y B básicamente :)) – JustDanyul

+0

Ok. Agregue el error que está recibiendo a la pregunta. – Perception

Respuesta

7

Su asignación es correcta y por eso la entrada se está guardado en la base de datos. El problema al recuperar es debido a Lazy Initialization.

para resolverlo modificar asignación de la clase A como,

@OneToMany(fetch=FetchType.LAZY) 
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="a_id")}, 
    inverseJoinColumns={@JoinColumn(name="b_id")} 
) 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
public Set<B> getBs() { 
    return bs; 
} 

Esto lanzará una consulta adicional a la tabla B e inicializar la colección. Puede afectar el rendimiento según el número de entradas en su tabla demandada.

Lea la API here para obtener más información.