0

セッションからトランザクションを開始した後、休止状態オブジェクトを照会すると、すべての子エンティティに対して NULL を取得する Hibernate + Spring Transaction Manager に関連する問題が発生しています。

SessionFactory からの新しいセッションが必要なときはいつでも、次のことを行います。

protected Session getSession(SessionFactory sessionFactory)
   throws DataAccessResourceFailureException {
      Session session = org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(sessionFactory, true);
      session.setFlushMode(FlushMode.MANUAL);
      return session;
}

次のように、セッションを取得してから使用します。

SessionFactory sessionFactory = (SessionFactory) beanFactory.getBean(getSessionFactoryBeanName()); // beanFactory is org.springframework.beans.factory.BeanFactory injected
Session session = getSession(sessionFactory);
session.beginTx
Criteria creteria = session.createCriteria(MyBean.class);
creteria.add(Restrictions.eq("id",myBean.getBeanId() ));
List<MyBean> res = creteria.list();
// Do some work on the beans
session.commit() 

この時点で、resリストには予想されるすべてのエントリが含まれています....しかし、それらのすべての子エンティティはNULL.

Spring アプリケーション コンテキスト XML ファイルからの関連エントリを次に示します。

  <bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
          <property name="configLocation" value="hibernate.cfg.xml"></property>
  </bean>
  <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
      <tx:method name="get*" read-only="true"/>
      <tx:method name="*"/>
    </tx:attributes>
  </tx:advice>
  <tx:advice id="txAdviceAll" transaction-manager="transactionManager">
    <tx:attributes>
      <tx:method name="*" />
    </tx:attributes>
  </tx:advice>
  <bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"
        scope="prototype" >
        <property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="MyBeanDAO"
    class="com.ndipiazza.MyBeanDAO">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
</bean>

アプリケーション コンテキストに欠陥がありますか? これらの子エントリを取得できないのはなぜですか? 検索する必要がある特別なエントリはありますか?

ここに mybean.hbm.xml があります

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.ndipiazza.MyBean" table="MY_BEAN" schema="ERESUSER_OWNER">
        <id name="myBeanId" type="java.lang.Long">
            <column name="MY_BEAN_ID" precision="22" scale="0" />
            <generator class="assigned" />
        </id>
        <many-to-one name="loadVerification" class="com.ndipiazza.LoadVerification" fetch="select">
            <column name="VERIFY_ID" precision="22" scale="0" not-null="true" />
        </many-to-one>
    </class>
</hibernate-mapping>

ここに MyBean.java があります

package com.ndipiazza;

/**
 * MyBean entity.
 * 
 * @author MyEclipse Persistence Tools
 */

public class MyBean implements java.io.Serializable {

    // Fields

    private Long myBeanId;
    private LoadVerification loadVerification;

    // Constructors

    /** default constructor */
    public MyBean() {
    }

    /** minimal constructor */
    public MyBean(Long myBeanId, LoadVerification loadVerification) {
        this.myBeanId = myBeanId;
        this.loadVerification = loadVerification;
    }

    public Long getMyBeanId() {
        return this.myBeanId;
    }

    public void setMyBeanId(Long myBeanId) {
        this.myBeanId = myBeanId;
    }

    public LoadVerification getLoadVerification() {
        return this.loadVerification;
    }

    public void setLoadVerification(LoadVerification loadVerification) {
        this.loadVerification = loadVerification;
    }
}
4

0 に答える 0