Ho una relazione molti-a-molti con una colonna aggiuntiva nella tabella dei collegamenti. L'ho configurato in modo che il lato proprietario recuperi i bambini desiderosi (quindi non ottengo LazyInitializationException
) e nella direzione opposta è pigro. Questo funziona.@Transactional (readOnly = true) porta a LazyInitializationException
ora voluto per mettere a punto le transazioni (prima c'era solo @Transactional
sul livello di classe di classi DAO e Service ho impostato il metodo getById
a readOnly = true
:.
@Transactional(readOnly = true)
public Compound getById(Long id) {
return compoundDAO.getById(id);
}
Dopo questa modifica ho un LazyInitializationException
in seguente frammento di codice:
Compound compound = compoundService.getById(6L);
Structure structure = compound.getComposition().get(0).getStructure();
System.out.println("StructureId: "+ structure.getId()); // LazyInitializationException
Se rimuovo (readOnly = true)
questo funziona qualcuno può spiegare questo comportamento io uso Primavera + Hibernate tipo di confusione, come non vedo alcuna ragione per cui esimo!?. dovrebbe influenzare quali dati sono stati caricati?
EDIT:
Frammenti di definizioni delle relazioni. Questo è un molti-a-molti con una colonna nella tabella dei collegamenti.
lato Possedere (ad es composto contiene Structures):
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.compound",
cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("pk.structure.id ASC")
private List<CompoundComposition> composition = new ArrayList<>();
Appartiene a lato:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.structure",
cascade = CascadeType.ALL)
@OrderBy("pk.compound.id ASC")
private List<CompoundComposition> occurence;
molti-a-uno in @Embeddable classe ID
@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 Trace
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]
EDIT 3:
veda anche il mio commento:
Log è molto diverso con readOnly e manca la parte erano i rapporti sono stati caricati, per esempio. alcuni selezioni mancano nel registro.
EDIT 4:
Così mi stanco con un DriverManagerDataSource di base e senza piscina Connection. Il problema è esattamente lo stesso. Per me sembra un problema in Hibernate.
Qual è la definizione della transazione a livello di classe? –
Solo @Transactional. –
Puoi pubblicare frammenti delle classi del modello? E hai ancora l'annotazione '@ Transactional' nella parte superiore della classe DAO? – sbzoom