【问题标题】:Autocreating transaction in DAO - spring mvc and hibernate在 DAO 中自动创建事务 - spring mvc 和 hibernate
【发布时间】:2014-03-19 20:04:26
【问题描述】:

我有 dao 扩展通用 dao 执行基本操作,例如保存、获取、删除和更新 DB 中的对象。

在每个操作中,我必须手动启动并提交事务。我试图找到自动完成的方法。

这是通用 dao 的实现:

@Transactional
public abstract class GenericDaoImpl<T> implements IGenericDao<T> {
    @Autowired
    protected SessionFactory sessionFactory;

protected Session getCurrentSession(){
    return sessionFactory.getCurrentSession();
}

private Class<T> type;

public GenericDaoImpl() {
    Type t = getClass().getGenericSuperclass();
    ParameterizedType pt = (ParameterizedType) t;
    type = (Class) pt.getActualTypeArguments()[0];
}

@Override
@Transactional
public void save(final T t) {
    Session session = getCurrentSession();
    Transaction tr = session.beginTransaction();
    session.save(t);
    tr.commit();
}
}

当我删除这两行时:

Transaction tr = session.beginTransaction();
tr.commit();

它不会起作用。我认为@Transactional 注释为我处理事务。

这是我的 bean 配置:

<bean id="sessionFactory"
          class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation">
            <value>WEB-INF/hibernate.cfg.xml</value>
        </property>
    </bean>



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

    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- this is the dao object that we want to make transactional -->
    <bean id="testDao" class="com.springapp.mvc.dao.GenericDaoImpl" abstract="true"/>



    <!-- the transactional advice  -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- all methods starting with 'get' are read-only -->
            <tx:method name="get*" read-only="true" />
            <!-- other methods use the default transaction settings (see below) -->
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>

spring事务管理应该怎么做约束?

【问题讨论】:

  • 哪个方法调用你的保存方法?这可能是代理问题。只有当您通过代理调用您的方法时,注释才会起作用。
  • @ArnaudPotier 我有服务,在我调用方法的服务具体 dao 中。那个具体的 dao 扩展了我的 GenericDao。我第一次听说代理,所以我可能没有使用它。你能告诉我更多吗?
  • 我添加了一个通用答案。

标签: spring hibernate transactions


【解决方案1】:

只要你有正确的配置,它确实,

如果你使用代理来访问你的 bean 方法,这样的方式是:

public class MyServiceImpl implements MyService

    @Autowired
    private GenericDao dao;

    public void someMethod() {
        dao.save(myObject)
    }

    //bla bla
}

如果您的 XML 配置中有 &lt;context:annotation-config/&gt;,它应该会自动装配您的 Dao 并调用 save 方法。

但它不会被包装在事务中:为了通过注解处理事务,Spring 使用了一个代理来包装你的方法调用。您可以在调试模块的 IDE 中看到这些调用。 带有“$proxy...”的巨大堆栈调用是由 spring 及其代理创建的。

&lt;tx:annotation-driven&gt; 指定spring应该使用注解来管理事务。 但是,它需要一个代理来将它们包装在方法调用周围。 因此,您需要将以下行添加到您的 XML:&lt;aop:aspectj-autoproxy /&gt;

希望这会有所帮助。

【讨论】:

  • 我将 添加到我的 xml 中,但 spring 仍然不会自动处理事务。
猜你喜欢
  • 2018-02-15
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多