Spring 业务函数上的事务性注释与其使用的DAO之间存在差异
我遇到了以下设置:Spring 业务函数上的事务性注释与其使用的DAO之间存在差异,spring,hibernate,transactionmanager,Spring,Hibernate,Transactionmanager,我遇到了以下设置: <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="hibernateSessio
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="hibernateSessionFactory" />
</bean>
<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<!-- connection string to read-write instance -->
</bean>
<bean id="roTransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="roHibernateSessionFactory" />
<qualifier value="readOnly" />
</bean>
<bean id="roHibernateSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="roDataSource" />
</bean>
<bean id="roDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<!-- connection string to read-only instance -->
</bean>
带有“ro”前缀的bean基本上是为了允许我们连接到数据库的只读实例而构建的
然后我遇到了这段代码,其中我们正在使用事务管理器,它应该为我们提供连接到只读实例的hibernate会话,同时使用注入读写数据源的DAOBean
<bean id="readWriteDao" class="com.services.dao.ReadWriteDao" scope="singleton">
<property name="sessionFactory" ref="hibernateSessionFactory" />
</bean>
@Transactional(value = "readOnly", propagation = Propagation.SUPPORTS,
readOnly = true)
public List<MyItem> findItems(List<Long> itemIds) {
return readWriteDao.findItems(itemIds);
}
@事务性(value=“readOnly”,传播=propagation.SUPPORTS,
只读=真)
公共列表findItems(列表项ID){
返回readWriteDao.findItems(ItemId);
}
我的问题是:
正如您在bean声明中所写的,它使用“hibernateSessionFactory”
(如果您通过一个只读sessionfactory加载一个实体并通过另一个sessionfactory保存它,我不知道应用程序会如何反应,因为这些对象永远不会在写会话中。有趣的方法;)findItems的bean的作用域/生存期是什么,也就是说,该方法是在哪个上下文中执行的?如果这是你的意思,那么它是一个单例bean,并且被注入到Web服务的实现类中。你能解释一下你是如何得出这个结论的吗?请回答我的第二个问题?顺便说一下,这是个错误。我认为应用程序不应该这样做。