結合と結合フェッチについて多くの質問があることは知っています。違いは次のように説明されています。
「フェッチ」結合を使用すると、値の関連付けまたはコレクションを、単一の選択を使用して親オブジェクトとともに初期化できます。これは、コレクションの場合に特に役立ちます。アソシエーションとコレクションのマッピング ファイルの外部結合と遅延宣言を効果的にオーバーライドします。
ただし、フェッチせずに内部結合または外部結合を使用する基準または HQL がある場合、エンティティが完全にフェッチされているように見えることに気付きました (私の hibernate マッピングは FetchType.LAZY を使用します)。これは、'join fetch' を書いたときだけ予想していました。したがって、この場合の違いはわかりません。
ここで何かが欠けているに違いありません。誰かがこれを明確にするのを手伝ってくれますか?
アップデート
StringBuilder hql = new StringBuilder();
hql.append("select question ")
.append("from User as user ")
.append("left join user.definition as definition ")
.append("left join definition.sections as section ")
.append("left join section.questions as question ")
.append("where user.id = :user");
Query query = getQuery(hql.toString());
query.setParameter("user.id", userId);
return query.list();
質問リストの最初の項目を調べると、次のようになります。
questions = {java.util.ArrayList@6756} size = 18
[0]={model.Question@6800}"model.Question@10f98160[]"
section = {Section$$_javassist_21@6873}"model.Section@7711057b[]"
handler = {org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer@6890}
interfaces = {java.lang.Class[1]@6897}
constructed = true
persistentClass = {java.lang.Class@2708}"class model.Section"
getIdentifierMethod = null
setIdentifierMethod = null
overridesEquals = true
componentIdType = null
replacement = null
entityName = {java.lang.String@6898}"model.Section"
id = {java.lang.Long@6881}"1"
target = {model.Section@6899}"model.Section@7711057b[]"
name = {java.lang.String@6909}"General"
sequence = 1
textStart = {java.lang.String@6910}"Some value"
textEnd = null
sectionVersion = 1
status = {model.SectionStatus@6911}"ACTIVE"
definitions = {org.hibernate.collection.internal.PersistentSet@6912} size = 1
questions = {org.hibernate.collection.internal.PersistentSet@6913} size = 13
validFrom = {java.sql.Timestamp@6914}"2012-01-01 00:00:00.0"
validTo = {java.sql.Timestamp@6915}"2099-01-01 00:00:00.0"
active = false
uuid = {java.util.UUID@6916}"97277496-12ee-453d-9478-9fc4e1519c02"
id = {java.lang.Long@6881}"1"
version = {java.lang.Integer@6882}"1"
initialized = true
readOnly = false
unwrap = false
session = {org.hibernate.internal.SessionImpl@6900}"SessionImpl(PersistenceContext[entityKeys= [EntityKey[model.PossibleAnswer#57], EntityKey[model.PossibleAnswer#56], EntityKey[PossibleAnswer#59], E...readOnlyBeforeAttachedToSession = null sessionFactoryUuid = null specjLazyLoad = false
Question クラスはそのセクションを参照しています。スタックトレースでは、HQL で「結合フェッチ」を指定していませんが、セクションが完全にロードされていることがわかります。