【发布时间】:2021-12-09 07:23:36
【问题描述】:
序言 - 使用 Spring
我对 spring @Transactional 注释的目的感到困惑。我从我读过的几篇博文中想到,它可以让我简化事务管理并只写这个,它会自动处理连接/提交/回滚:
public class DaoImpl implements Dao {
@Autowired
private SessionFactory sessionFactory;
@Transactional
public void saveOrUpdateOne(final AdditionalDataItem item) {
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(p_item);
}
}
但这给了我一个例外:“调用方法'saveOrUpdate'在没有活动事务的情况下无效”
如果我改为将保存方法更改为此,一切正常 - 所以我的问题是,@Transactional 在做什么?
@Override
@Transactional
public void saveOrUpdateOne(final AdditionalDataItem p_item) {
Session session = null;
Transaction trans = null;
try {
session = sessionFactory.getCurrentSession();
trans = session.beginTransaction();
TransactionStatus status = trans.getStatus();
session.saveOrUpdate(p_item);
trans.commit();
} catch (Exception e) {
LOGGER.error("Exception saving data: {}", e.getMessage());
if (trans != null) {
try {
trans.rollback();
} catch (RuntimeException rbe) {
LOGGER.error("Couldn’t roll back transaction", rbe);
}
}
} finally {
if (session != null && session.isOpen()) {
try {
session.close();
} catch (HibernateException ne) {
LOGGER.error("Couldn’t close session", ne);
}
}
}
}
作为参考,我将 Java 11 与 Spring Framework 5.3.7 和 hibernate 5.5.7 一起使用,并具有适当的 dao、会话工厂和 tx 管理器 bean:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="${sessionFactory.datasource}" />
<property name="configLocation" value="${sessionFactory.configLocation}" />
</bean>
<bean id="txManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="Dao" class="com.xxxxx.dao.DaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
【问题讨论】:
-
你的daoimpl是spring组件吗?
-
是的,我已经编辑了问题以显示正在定义的 DAO bean。我也尝试将@Service 添加到 bean 但得到相同的结果。
-
你从哪里调用 saveOrUpdateOne?
-
您的 xml 中是否有
,或者在某些 @Configuration 类中有注释 EnableTransactionManagement?
标签: java spring hibernate transactions