セッションからトランザクションを開始した後、休止状態オブジェクトを照会すると、すべての子エンティティに対して 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;
}
}