Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LazyInitializationException Within a @Transactional Method

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?

like image 971
Tyler Murry Avatar asked Feb 16 '12 19:02

Tyler Murry


1 Answers

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).

like image 197
machinery Avatar answered Oct 19 '22 00:10

machinery