インスタンス化後にオブジェクトをデータベースからオブジェクト キャッシュにロードするサービス Bean があります。DAO オブジェクト メソッドを呼び出すサービス メソッドに @Transactional というラベルを付けると、「HibernateException: 現在のスレッドのセッションが見つかりません」というエラーが発生します。ただし、DAO クラスに @Transactional というラベルを付けると、そのようなエラーは発生せず、正常に動作します。
問題は、サービス オブジェクト内の同じメソッドから複数の DAO 呼び出しを行うことができず、それを 1 つのトランザクションにすることができないことです。これを引き起こす原因について何か考えはありますか?
Spring 3.1 と Hibernate 4 を使用しています。
DAO の例:
@Repository
public class HibernateObjectDao implements ObjectDao {
SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public List<Object> getObjects() {
return sessionFactory.getCurrentSession()
.createQuery("from Object").list();
}
}
サービス Bean の例:
@Service
public class MyServiceBean implements AbstractMyServiceBean
{
@Resource
private ObjectDao objectDao;
private HashMap<String,Object> objectCache;
public MyServiceBean() {
this.objectCache = new HashMap<String,Object>();
}
@Autowired
public void setObjectDao(ObjectDao objectDao) {
this.objectDao = objectDao;
}
@Transactional
public void initialize() {
loadObjectCache();
}
public void loadObjectCache() {
objectCache.put("stuff",this.objectDao.getObjects())
}
}
ApplicationContext.xml の抜粋:
<bean id="objectDao" class="com.example.persistence.HibernateObjectDao">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="myServiceBean"
class="com.example.service.MyServiceBean"
init-method="initialize">
<property name="objectDao" ref="objectDao" />
</bean>