【问题标题】:Discrepancy between Transactional annotation on a Business function and DAO it uses业务功能上的事务注释与其使用的 DAO 之间的差异
【发布时间】:2016-08-09 18:36:37
【问题描述】:

我遇到了以下设置:

<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基本上是为了让我们能够连接到数据库的只读实例。

然后我遇到了这段代码,其中我们使用事务管理器,它应该为我们提供连接到只读实例的休眠会话,同时使用注入读写数据源的 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);
}

我的问题是:

  1. 这段代码使用的是哪个实例?
  2. 如何通过日志记录验证这一点?

【问题讨论】:

  • findItems 的 bean 的作用域/生命周期是什么,即该方法在哪个上下文中执行?
  • 这是一个单例 bean,如果这就是您的意思,并被注入到 Web 服务的实现类中。

标签: spring hibernate transactionmanager


【解决方案1】:

正如您在 bean 声明中所写,它使用“hibernateSessionFactory”。

(如果您通过只读 sessionfactory 加载实体并通过其他 sessionfactory 保存它,我不知道应用程序会如何反应,因为这些对象永远不会在写入会话中。有趣的方法;)

【讨论】:

  • 您能解释一下您是如何得出这个结论的吗?另外请回答我的第二个问题?顺便说一句,这是一个错误。我认为应用程序不应该这样做。
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 2010-12-10
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2013-03-26
  • 1970-01-01
相关资源
最近更新 更多