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化されないっぽい