Tengo una relación de muchos a muchos con una columna adicional en la tabla de enlaces. Lo configuré de una manera que el lado propietario atrae a los niños ansiosos (así que no obtengo LazyInitializationException
) y en la dirección opuesta es flojo. Esto funciona.@Transactional (readOnly = true) lleva a LazyInitializationException
Ahora quería afinar las transacciones (antes sólo había @Transactional
en el nivel de clase de las clases DAO y el servicio que defina Método getById
a readOnly = true
:.
@Transactional(readOnly = true)
public Compound getById(Long id) {
return compoundDAO.getById(id);
}
Después de este cambio recibo una LazyInitializationException
en siguiente fragmento:
Compound compound = compoundService.getById(6L);
Structure structure = compound.getComposition().get(0).getStructure();
System.out.println("StructureId: "+ structure.getId()); // LazyInitializationException
Si quito (readOnly = true)
esto funciona puede alguien explicar este comportamiento utilizo primavera + Hibernate algo confuso ya que no veo ninguna razón por la TH!?. ¿Debería afectar qué datos se cargan?
EDIT:
fragmentos de definiciones de relaciones. Este es un muchos-a-muchos con una columna en la tabla de enlaces.
lado propietario (por ejemplo el Compuesto contiene estructuras):
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.compound",
cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("pk.structure.id ASC")
private List<CompoundComposition> composition = new ArrayList<>();
Pertenece a lado:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.structure",
cascade = CascadeType.ALL)
@OrderBy("pk.compound.id ASC")
private List<CompoundComposition> occurence;
Muchos-a-uno en la clase ID @Embeddable
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Compound getCompound() {
return compound;
}
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Structure getStructure() {
return structure;
}
EDIT 2 :
St ACK traza
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:272) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.bitbucket.myName.myApp.entity.Structure_$$_javassist_0.getId(Structure_$$_javassist_0.java) ~[classes/:na]
at org.bitbucket.myName.myApp.App.main(App.java:31) ~[classes/:na]
Datos 3:
también ver mi comentario:
Log es muy diferente con readOnly y le falta la parte eran las relaciones se cargan, por ejemplo. algunas selectas faltan en el registro.
EDITAR 4:
Así que cansado con una DriverManagerDataSource básico y no hay piscina conexión. El problema es exactamente el mismo. Para mí parece un problema en Hibernate.
¿Cuál es la definición de transacción de nivel de clase? –
Just @Transactional. –
¿Se pueden publicar fragmentos de las clases modelo? Y, ¿todavía tienes la anotación '@ Transactional' en la parte superior de la clase DAO? – sbzoom