【发布时间】: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