6

次の実行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

これで問題は絞り込まれますが、この時点でトランザクションがアクティブにならないのはなぜですか?

4

2 に答える 2

5

これはすでに回答されていますが、同様のケースで私のために働いた別の回答を投稿したかっただけです-将来の世代のために;)

私の場合、問題は、遅延ロードされたコレクションを含むインスタンスが手動で削除されたという事実によって引き起こされました (すべてトランザクション境界内)。

于 2014-03-10T08:49:39.743 に答える
0

構成ファイルを<tx:annotation-driven />設定し、Spring で管理されたバージョンのサービス クラスを使用して (displayAddresses() メソッドを呼び出す)、うまくいきました。

于 2012-02-17T14:08:41.173 に答える