LazyInitializationException Within a @Transactional Method
-
26-10-2019 - |
Pergunta
I am running into the org.hibernate.LazyInitializationException
error when I try to access a lazy loaded exception when excecuting the following:
@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());
}
My entities look like this:
@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;
...
}
I was under the impression that by using the @Transactional annotation in my displayAddresses()
method, it would keep the session alive until the method was completed, allowing me to access the lazy-loaded Address collection.
Am I missing something?
EDIT
In accordance with Tomasz's advice: Within my displayAddresses()
method, the status of TransactionSynchronizationManager.isActualTransactionActive(),
turned out to be false
.
That does narrow down the problem, but why would my Transaction not be active at this point?
Solução 2
Having <tx:annotation-driven />
in my configuration file and using a Spring-managed version of my service class (to call the displayAddresses() method) did the trick.
Outras dicas
This is already answered, but just wanted to post an alternative answer which worked for me in a similar case - for future generations ;)
In my case the issue was caused by the fact that the instance which contained the lazy-loaded collection had been manually evicted (all within transaction boundaries).