使用Hibernate和Spring时的事务管理

时间:2014-12-17 13:27:25

标签: hibernate transactions spring-transactions

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

我也不期待免费午餐,也不希望有人想要别人做我的功课

我做了google并阅读有关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

这是有效的交易管理吗?

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

由于

1 个答案:

答案 0 :(得分:0)

此配置不足以进行正确的tx管理。

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

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

让spring app调用dao一次,再做一次select。如果该值现在已经改变,如果不使用服务方法,则没有正确的tx管理(当然,在自动提交模式下,您有一个jdbc连接)。