hibernate session.flush with spring @transactional
我在我的应用程序中使用spring和hibernate并使用spring事务。
所以我在方法和带有数据库查询方法的DAO层上有注释@transaction的服务层。
@Transactional(readOnly = false) public void get(){ }
问题是当我想在数据库中保存一个对象时,我必须在DAO层方法结束时使用session.flush()
。为什么?
我想如果我有注释@ transaction,那么spring应该在完成服务方法时自动提交事务。
DAO层:
public BaseEntity saveEntity(BaseEntity entity) throws Exception { try { Session session = sessionFactory.getCurrentSession(); session.saveOrUpdate(entity); session.flush(); } catch (HibernateException he) { throw new Exception("Failed to save entity " + entity); } return entity; }
服务层:
@Transactional(readOnly = false) public BaseEntity saveEntity(BaseEntity entity) throws Exception { return dao.saveEntity(entity); }
弹簧配置:
是的,如果您的DAO方法有@Transactional
,那么您不需要手动刷新会话,如果方法中的操作成功,hibernate将负责刷新会话作为提交事务的一部分。
查看此链接以了解@Transactional的工作原理 – Spring – @Transactional – 后台会发生什么?
默认情况下,hibernate会堆叠其查询,以便在最终执行到数据库时对其进行优化。
刷新的漏洞是刷新此堆栈并在事务中将其执行到数据库中。 你离开jvm的“保存”房子并在一个大的奇怪的数据库上执行你的查询。
这就是为什么你不能选择你刚刚保存而没有同花顺的东西。 它根本就不在数据库中。
commit的含义是在事务结束后结束,并使数据库的更改对其他人可见。 一旦执行了提交,就不再有可能返回。
坦率地说,我不确定它是否是最佳实践,但对于正常的CRUD操作,您应该能够在您的dao层中添加flush。 这样您就不必担心它会进入服务层。
如果您希望java优化您的交易,那么您必须将其添加到您的服务层。 但请记住,在没有任何问题时你不需要解决性能问题! 将代码中的所有代码刷新到服务层中对代码可读性不利。 保持简单和愚蠢;)
- 启动时出现Hibernateexception
- org.hibernate.MappingNotFoundException:resource:*找不到hbm.xml
- 将Hibernate查询结果映射到自定义类?
- 如何从hibernate提供程序知道底层数据库名称
- Hibernate-懒得初始化一个角色集合:beans.Language.patients,无法初始化代理 – 没有Session
- Hibernate Criteria – 返回列不同的记录
- 在只读模式下不允许执行Spring Write操作
- org.hibernate.TransientObjectException:object引用未保存的瞬态实例 – 在刷新之前保存瞬态实例
- Hibernate强制时间戳持续/加载为UTC