次の実行org.hibernate.LazyInitializationException
時に遅延ロードされた例外にアクセスしようとすると、エラーが発生します。
@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());
}
私のエンティティは次のようになります。
@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;
...
}
メソッドで@Transactional アノテーションを使用するとdisplayAddresses()
、メソッドが完了するまでセッションが維持され、遅延ロードされた Address コレクションにアクセスできるようになるという印象を受けました。
何か不足していますか?
編集
Tomasz のアドバイスに従って: 私のdisplayAddresses()
方法では、 のステータスは であることがTransactionSynchronizationManager.isActualTransactionActive(),
判明しましたfalse
。
これで問題は絞り込まれますが、この時点でトランザクションがアクティブにならないのはなぜですか?