【问题标题】:Transaction management when using Hibernate and Spring使用 Hibernate 和 Spring 时的事务管理
【发布时间】:2014-12-17 13:27:24
【问题描述】:

如果这是一个太基本的问题,请原谅我!

我也不希望有免费的午餐,也不想给人留下希望别人做我的功课的印象

我在谷歌上搜索并阅读了关于 SO 的详细信息,但我对此感到非常困惑

这是我的工作 我只需要简单地进行搜索并从数据库中返回结果

我们正在使用 weblogic,因此是一个托管环境,它为我提供了连接

我们已经像这样配置了会话工厂详细信息:

<hibernate-configuration>
  <session-factory>
    <property name="connection.datasource">MYDS</property>
    <property name="show_sql">true</property>
    <property name="default_schema">CLIENT1SCHEMA</property>
  </session-factory>
</hibernate-configuration>

在我的 Spring 应用程序上下文中 - 定义了 sessionFactory 和 TransactionManager,然后将会话工厂注入我的 DAO

<bean id="sessionFactoryX" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  <property name="configLocation" value="classpath:abc.hibernate.cfg.xml" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactoryX" />
</bean>

<bean id="myCustomDao" class="com.xyz.MyCustomDao" lazy-init="true">
  <property name="criteriaConverter" ref="criteriaConverter" />
  <property name="sessionFactory" ref="sessionFactoryX" />
</bean>

现在在我的 dao 中 - 我只是想做一个搜索 - 所以这是我已经实现的:

public List<T> findAll(final HashMap param) {
    List<T> listData = null;
    Criteria subSelectCriteria =null;
try {
    Session session=getSessionFactory().getCurrentSession();
    subSelectCriteria =session.createCriteria(getType());
    } catch (HibernateException e) {
        e.printStackTrace();
    }
boolean isDistinctQuery=false;
    subSelectCriteria.setFirstResult(0);
    subSelectCriteria.setMaxResults(100);
    List inObjList = subSelectCriteria.list();
    if(!inObjList.isEmpty()){
        listData = inObjList;
    } 
return listData;   

}

这一切都很好,并且在遇到许多与事务管理相关的问题后达到了上述配置 - 我已在此处发布: Transaction Management using Hibernate with weblogic

现在这是我的基本问题: 我没有明确编写的事务管理代码: 既不是通过 AOP 在我的服务层中也不是 @Transactional

它似乎只需注入:

org.springframework.orm.hibernate4.HibernateTransactionManager

那么这是有效的事务管理吗?

我正在尝试实现多租户 - 按照之前的线程 - 但这不是我的问题

谢谢

【问题讨论】:

    标签: hibernate transactions spring-transactions


    【解决方案1】:

    此配置不足以进行适当的 tx 管理。

    为了测试它,我建议你创建一个写入操作,在你的 dao 中写入每次调用的变化数据(如当前日期)。

    在一个服务方法中对该方法进行两次调用,调试,在第一次调用 dao 方法之前暂停,并使用外部客户端进行选择以查看将修改的内容。

    让spring app调用一次dao,再做一次select。如果现在值发生了变化,但没有退出服务方法,那么您就没有适当的 tx 管理(当然,您有一个处于自动提交模式的 jdbc 连接)。

    【讨论】:

    • 谢谢 - 我现在很困惑 - 定义 HibernateTransactionManager 有什么意义? - 这是否意味着在我的服务层中我将不得不编写事务管理(声明性或使用事务性注释?)
    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2012-10-16
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多