単純化するEntity
と、次のようになります。
@Entity
@Table(name = "SOMETABLE")
public class SomeEntity {
// real code has id and more columns
@Column(name = "SOMECOLUMN")
private String someColumn;
@Transient
private SomeObject transientObject;
// getters and setters
}
@NamedQuery
DAO メソッドは、および JPA EntityManager
(大まかにスタブ化)を使用して、エンティティのリストを読み込みます。
@Transactional
public List<SomeEntity> getSomeEntities() {
TypedQuery<SomeEntity> query = entityManager.createNamedQuery("findSomeEntities", SomeEntity.class);
List<SomeEntity> someEntities = query.getResultList();
for (SomeEntity someEntity : someEntities) {
someEntity.setTransientObject(<some value here>);
return someEntities;
}
}
このメソッドも設定することに注意してくださいtransientObject
(コード例では簡略化されています)。
次回getSomeEntities()
呼び出されると、まだ設定されているquery.getResultList();
オブジェクトのリストが返されます。transientObject
一時オブジェクトが null であることを期待しますが、そうではありません。有効な第 1 レベルまたは第 2 レベルのキャッシュはありません。
これをさらに混乱させるために、これは HSQL インメモリ データベースを使用する単体テスト中にのみ発生します。Tomcat サーバーで Web アプリケーションを実行すると、問題なく動作します。
少しデバッグしたところ、セッション キャッシュ(Hibernate では常に有効になっていることを理解しています) では、単体テストを実行すると、以前に読み込まれたすべてのオブジェクトが読み込まれているように見えますが、アプリケーション サーバーで実行すると空でした。これは、休止状態がデータベースではなくキャッシュからオブジェクトをフェッチすることを意味していると思われます。
また、Spring アプリケーションであることも知っておく価値があります。
これの理由は何ですか?または、私の主な問題を言い換えると、HSQLDB を使用してエンティティを 2 回目にロードするときに一時オブジェクトが null にならないのはなぜですか?