我有一个服务 bean,它在实例化后从数据库中加载对象到对象缓存中。如果我将调用我的 DAO 对象方法的服务方法标记为 @Transactional,那么我会收到“HibernateException: No Session found for current thread”错误。但是,如果我将 DAO 类标记为 @Transactional,则不会出现此类错误,并且可以正常工作。
问题是我不能从服务对象中的同一个方法进行多个 DAO 调用并将其作为一个事务。对可能导致这种情况的原因有什么想法吗?
我正在使用 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>