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?
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With