リンク テーブルの追加の列と多対多の関係があります。私は、所有側が熱心に子をフェッチするように構成しました (したがって、私は取得しませんLazyInitializationException
)。反対方向では怠惰です。これは機能します。
私は今、トランザクションを微調整したいと思っていました ( @Transactional
DAO クラスとサービス クラスのクラス レベルだけになる前に。私はメソッドgetById
を次のように設定しましたreadOnly = true
:
@Transactional(readOnly = true)
public Compound getById(Long id) {
return compoundDAO.getById(id);
}
この変更の後LazyInitializationException
、次のスニペットを取得します。
Compound compound = compoundService.getById(6L);
Structure structure = compound.getComposition().get(0).getStructure();
System.out.println("StructureId: "+ structure.getId()); // LazyInitializationException
これを削除すると(readOnly = true)
機能します!誰でもこの動作を説明できますか? 私はSpring + Hibernateを使用しています。これがロードされるデータに影響を与える理由がわからないので、ややこしいですか?
編集:
関係定義のスニペット。これは、リンク テーブルに列がある多対多です。
所有側 (例: 化合物に構造が含まれる):
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.compound",
cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("pk.structure.id ASC")
private List<CompoundComposition> composition = new ArrayList<>();
側に属します:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.structure",
cascade = CascadeType.ALL)
@OrderBy("pk.compound.id ASC")
private List<CompoundComposition> occurence;
@Embeddable ID クラスの多対一
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Compound getCompound() {
return compound;
}
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Structure getStructure() {
return structure;
}
編集2:
スタックトレース
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:272) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.bitbucket.myName.myApp.entity.Structure_$$_javassist_0.getId(Structure_$$_javassist_0.java) ~[classes/:na]
at org.bitbucket.myName.myApp.App.main(App.java:31) ~[classes/:na]
編集3:
私のコメントも参照してください:
ログは readOnly とは大きく異なり、リレーションが読み込まれた部分が欠落しています。ログにいくつかの選択がありません。
編集4:
したがって、基本的な DriverManagerDataSource と接続プールがないことにうんざりしていました。問題はまったく同じです。私にとっては、休止状態の問題のように見えます。