てきとうなメモ

本の感想とか技術メモとか

many-to-oneのlazy load

Hibernateはデフォルトで多対1の関連もlazy loadのはずなんだが、primary keyでの関連ではないとlazy loadしてくれないっぽい。

org.hibernate.engine.TwoPhaseLoad#initializeEntityで初期化していないEntityを初期化するコードの部分で、org.hibernate.Typeごとにresolveが呼ばれて、関連エンティティの場合org.hibernate.type.EntityType#resolveが呼ばれる。

public Object resolve(Object value, SessionImplementor session, Object owner) throws HibernateException {
  if ( isNotEmbedded( session ) ) {
    return value;
  }

  if ( value == null ) {
    return null;
  }
  else {
    if ( isNull( owner, session ) ) {
      return null; //EARLY EXIT!
    }

    if ( isReferenceToPrimaryKey() ) {
      return resolveIdentifier( (Serializable) value, session );
    }
    else {
      return loadByUniqueKey( getAssociatedEntityName(), uniqueKeyPropertyName, value, session );
    }
  }
}

となっているので、primary keyではないと別処理になってしまってproxy化されないっぽい