Hibernateセッションは1つのPOJOに多くを盗んために開いたままにします

明レオン:

私は2 POJO、イベントやOrganizerProfileを持っています。彼らの関係は1対多数あります。私は、データベースからイベントを取得した場合、OrganizerProfileではなく、それがどうあるべきかのデバッガから空として表示されます。また、私はevent.getOrganizerProfileを呼び出すために開いているHibernateのSessionを残しています。

私はイベントを取得する場合、近くのHibernate Session、[イベント内OrganizerProfileを取得することはできません。

        new EventDTO(this.getEvtByDateAddress(_event.getDate(), _event.getAddress(), /*dont close sess*/false));

あなたはこれを説明していただけますか?

感謝

<hibernate-mapping package="com.example.client.serializable">
   <class name="Event" table="event">
   <id name="oid" type="long" column="oid">
     <generator class="increment">
        <param name="initial_value">1</param>
     </generator>
  </id>
  <property name="evtName">
     <column name="evtName"/>
  </property>
  <property name="address">
     <column name="address"/>
  </property>
  <property name="date" type="date">
     <column name="date"/>   
  </property> 
  <many-to-one name="organizerProfile" cascade="all"></many-to-one>
</class>
</hibernate-mapping>

<hibernate-mapping package="com.example.client.serializable">
<class name="OrganizerProfile" table="organizerprofile">
  <id column="oid" name="oid" type="long">
  <generator class="increment">
    <param name="initial_value">1</param>
  </generator>
  </id>
  <property generated="never" lazy="false" name="acctOid">
    <column name="acctOid"/>
  </property>
  <property generated="never" lazy="false" name="email">
    <column name="email"/>
  </property>
  <property generated="never" lazy="false" name="name">
    <column name="name"/>
  </property>
  <property generated="never" lazy="false" name="contact">
    <column length="5120" name="contact"/>
  </property>
  <property name="profilePicName">
    <column name="profilePicName"/>
  </property>
</class>
</hibernate-mapping>

public Event getEvtByDateAddress(Date _date, String _address, boolean _closeSess)
{
    try
    {
        if(!session.isOpen())
        {
            session = HibernateUtil.getSessionFactory().openSession();
        }
        session.beginTransaction();
        Criteria criteria = session.createCriteria(Event.class);
        criteria.add(Restrictions.eq("date", _date));
        criteria.add(Restrictions.eq("address", _address));
        Event evt = (Event)criteria.uniqueResult();
        if(_closeSess)
        {
            session.close();
        }
        if (evt==null)
        {
            LogUtils.logInfo("The event does not exist: " + _date + " " + _address);
            return null;
        }
        else
        {
            return evt;
        }
    }
    catch(Exception e)
    {
        LogUtils.logInfo(e.toString());
        if(_closeSess)
        {
            session.close();
        }
        return null;
    }
}

public EventDTO(Event _event)
{
    this.oid=_event.getOid();
    this.evtName=_event.getEvtName();
    this.address=_event.getAddress();
    this.date=_event.getDate();
    this.evtPicName=_event.getEvtPicName();
    this.organizerProfile=new OrganizerProfileDTO(_event.getOrganizerProfile());
}
PaulD:

<many-to-one name="organizerProfile" cascade="all"></many-to-one>

あなたがプロパティを指定していないのでlazy、あなたの多対1のマッピングでは、関連するエンティティは、(参照プロキシされます休止状態マッピングのドキュメント点12のように、あなたの関連するエンティティがフェッチではありません)、セッションのセッションの外側、内側をアクセスすることはできませんあなたがそれにアクセスしようとすると、Hibernateは自動的にそれを取得しますので、あなたは、それをアクセスすることができます。

両方のセッション内で- -あなたはそれを手動で取得するために持っているセッションの関連するエンティティの外にアクセスしたい場合は、Hibernateはそれを初期化させたり、(熱心に自分のフェッチタイプを設定することができ<many-to-one name="organizerProfile" cascade="all" lazy="false"></many-to-one>、私はお勧めしませんがある)(N + 1つの選択問題点)。

あなたのコードとマニュアルフェッチの例:

Criteria criteria = session.createCriteria(Event.class);
criteria.setFetchMode("organizerProfile", FetchMode.JOIN);
criteria.add(Restrictions.eq("date", _date));
criteria.add(Restrictions.eq("address", _address));

読みもおそらく役に立つ:Hibernateは4.3ドキュメントを#20:パフォーマンスのフェッチ

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=21605&siteId=1