LazyInitializationException Au sein d'une méthode @Transactional
-
26-10-2019 - |
Question
Je suis en cours d'exécution dans l'erreur de org.hibernate.LazyInitializationException
lorsque je tente d'accéder à une exception chargée paresseux quand excecuting les éléments suivants:
@Transactional
public void displayAddresses()
{
Person person = getPersonByID(1234);
List<Address> addresses = person.getAddresses(); // Exception Thrown Here
for(Address address : addresses)
System.out.println(address.getFullAddress());
}
Mes entités ressemblent à ceci:
@Entity
@Table("PERSON_TBL")
public class Person
{
...
@OneToMany(cascade=CascadeType.ALL, targetEntity=Address.class, mappedBy="person")
private List<Address> addresses;
...
}
@Entity
@Table("ADDRESS_TBL")
public class Address
{
...
@ManyToOne(targetEntity=Person.class)
@JoinColumn(name="PERSON_ID", referencedColumnName="PERSON_ID")
Person person;
...
}
J'avais l'impression qu'en utilisant l'annotation @Transactional dans ma méthode de displayAddresses()
, il garderait la session en vie jusqu'à ce que la méthode a été terminée, me permettant d'accéder à la collecte d'adresses paresseux chargé.
Am quelque chose que je manque?
EDIT
Conformément à l'avis de Tomasz: Dans ma méthode de displayAddresses()
, l'état de TransactionSynchronizationManager.isActualTransactionActive(),
avéré être false
.
Cela ne réduit sur le problème, mais pourquoi ma transaction ne pas être actif à ce stade?
La solution 2
Avoir <tx:annotation-driven />
dans mon fichier de configuration et en utilisant une version gérée Spring-de ma classe de service (pour appeler la méthode displayAddresses ()) a fait l'affaire.
Autres conseils
Ceci est déjà répondu, mais je voulais juste pour poster une réponse alternative a fonctionné pour moi dans une affaire similaire - pour les générations futures;)
Dans mon cas, la question a été causé par le fait que l'instance qui contenait la collection lazy-chargé avait été évincé manuellement (tous dans les limites de transaction).