我遇到了以下设置:
<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会话,同时使用注入了读写数据源的DAO bean。
<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);
}
我的问题是:
- 此代码使用的是哪个实例?
- 我如何通过日志验证?
正如您在bean声明中所写的那样,它使用"hibernateSessionFactory"。
(我不知道应用程序如何反应,如果你通过一个只读的sessionfactory加载一个实体,并通过另一个sessionfactory保存它,因为这些对象永远不会在写会话。有趣的方法;))