当前位置: 首页 > 面试题库 >

@Transactional如何影响Hibernate中的当前会话?

白翔
2023-03-14
问题内容

这是大多数DAO中使用的典型设置:

@Transactional
@Repository
public class DAO {

   @Autowired
   SessionFactory sessionFactory;

   public void save(Entity o) {
       sessionFactory.getCurrentSession().save(o);
   }

   public Entity load(int id) {
       return (Entity)sessionFactory.getCurrentSession().get(Entity.class, id);
   }

}

我看到只有getCurrentSession()呼叫,否openSessionclose

因此,当我load从不在会话中返回实体时,无法加载惰性集合。类似地,保存似乎总是同花顺!

@TransactionalSpring 的注解本身就具有开启和关闭会话以及交易的魔力吗?


问题答案:

在Spring中,由划定的业务交易@Transactional与hibernate之间存在一一对应的关系Session

也就是说,当通过调用@Transactional方法开始业务交易时,将创建hibernate会话(TransactionManager可能将实际创建延迟到首次使用该会话之前)。该方法完成后,将提交或回滚业务事务,这将关闭hibernate会话。

在您的情况下,这意味着调用DAO方法将开始一个新的事务(除非某个事务已经在进行中),退出DAO方法将结束它,这将关闭hibernate会话,并刷新它,并提交或滚动返回相应的hibernate事务,然后提交或回滚相应的JDBC事务。

对于这种典型用法,hibernate文档将此称为每次操作会话反模式。同样,@Transactionalspring参考手册中的所有示例都放在业务服务方法(或类)上,而不是存储库上。



 类似资料:
  • 我可以将:before CSS伪元素与SVG tspan元素一起使用吗? 具体地说,我正试图使字体在SVG中工作得非常好,而不必像这里所解释的那样对所有字符进行重新编码,而只是向元素添加正确的类。 换句话说,我希望能够做到这一点: 并看到它的工作。

  • 这是我在班级游戏板。在这节课中,我尝试制作一个GameTree来返回这个棋盘上所有可能的下一步动作的列表。当这部分代码运行时,它会影响游戏板,因为它包含了这段代码,导致所有的移动实际上都是在游戏板上进行的,在游戏板上,我只是尝试用一个移动来返回板。下面是Gameboard中的代码: 我不明白为什么这不是简单地创建一个新的游戏板对象,播放有效的移动,并将其添加到列表。相反,在这个for循环结束时,游

  • 但获得以下异常: 我搜索了一下,在SO上找到了类似的问题,解决方法如下: 这就解决了问题。但在该解决方案中,手动开始和提交事务会有很多麻烦。 请帮帮忙。

  • 问题内容: 是否可以定义默认情况下在哪个架构中创建新表?(由“不合格的表名”引用。) 我已经在Postgres中看到了有关使用“搜索路径”的一些详细信息,但是我认为它仅在检索数据而不是创建时才起作用。 我有一堆SQL脚本,它们创建许多表。我不想修改脚本,而是希望在默认模式下将数据库创建表设置为特定的模式-当它们具有非限定名称时。 这可能吗? 问题答案: 搜索路径的确是您想要的:

  • 问题内容: 我有一个使用spring和hibernate的java stuts2 Web应用程序。 我越来越。 SpringBean.xml hibernate.cfg.xml CustomerServiceImpl.java CustomerDaoImpl.java CustomerAction.java 我得到的例外 问题答案: 您在Spring配置中指定了一个事务管理器,但是没有关于何时或何

  • 我在寻找下一个问题的解决方法。我使用Spring,我有一些不应该被阻塞的Executor的线程(至少读/写数据库)。有几个任务可以通过这个执行器执行,我不知道哪一个可以使用方法或任何其他方法来访问数据库。我想禁止在执行者的线程中打开新的事务,怎么做? 小例子