gpt4 book ai didi

spring - 将 session 对象注入(inject)DAO bean而不是 session 工厂?

转载 作者:行者123 更新时间:2023-12-04 18:44:47 25 4
gpt4 key购买 nike

在我们的应用程序中,我们使用 Spring 和 Hibernate。

在所有 DAO 类中,我们都有 SessionFactory 自动连接,并且每个 DAO 方法都调用 getCurrentSession() 方法。

我的问题是为什么我们不在原型(prototype)范围内注入(inject) Session 对象而不是 SessionFactory 对象?这将为我们节省对 getCurrentSession 的调用。

我认为第一种方法是正确的,但是寻找第二种方法会引发错误或性能不佳的具体场景?

最佳答案

当您将 bean 定义为原型(prototype)作用域时,会为每个需要注入(inject)它的位置创建一个新实例。所以每个 DAO 都会得到一个不同的 Session 实例,但是 DAO 上的所有方法调用最终都会使用同一个 session。由于 session 不是线程安全的,因此不应在多个线程之间共享,这将是一个问题。

在大多数情况下, session 应该是事务范围,即在事务开始时打开一个新 session ,然后在事务完成后自动关闭。在少数情况下,它可能必须扩展到请求范围。

如果您想避免使用 SessionFactory.currentSession - 那么您将需要定义自己的范围实现来实现这一点。

这是已经使用代理为 JPA 实现的东西。在 JPA 的情况下,注入(inject)的是 EntityManager 而不是 EntityManagerFactory。代替 @Autowired 有一个新的 @PersistenceContext 注释。在初始化期间创建并注入(inject)代理。当调用任何方法时,代理将获取实际的 EntityManager 实现(使用类似于 SessionFactory.getCurrentSession 的东西)并委托(delegate)给它。

类似的事情也可以为 Hibernate 实现,但额外的复杂性是不值得的。在内部调用 SessionFactory.getCurrentSession() 的 BaseDAO 中定义 getSession 方法要简单得多。这样,使用 session 的代码与注入(inject) session 相同。

关于spring - 将 session 对象注入(inject)DAO bean而不是 session 工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16848938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com