优点与缺点-HibernateUtil与@Autowired SessionFactory

时间:2019-03-13 20:08:40

标签: java hibernate autowired sessionfactory

我试图更好地了解我们如何使用Hibernate的利弊。我对使用HibernateUtil.java很有经验,我在其中调用以建立/获取用于数据访问交互的会话。但是,我维护了利用@Autowired属性在DAO中实现SessionFactory的应用程序。如果不明显,我们将使用Spring MVC。

下面是一些有关如何使用它们的简要示例:

方法A

public class MyDao {

   public static void save() {
      Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
      session.beginTransaction();
      // ...
   }

}

方法B

public class MyDaoImpl implements MyDao {

   private SessionFactory sessionFactory;

   //... getter/setter for session factory

   public void save() {
      Session session = getSessionFactory().getCurrentSession(); 
      session.beginTransaction();
      // ...
   }


}

我很好奇为什么一种方法要比另一种方法使用。两者在性能或内存消耗上有区别吗?您是否遇到过注入Bean妨碍高效完成任务的情况?服务类是否应该实例化DAO的实例以访问其方法,还是您喜欢使用静态方法?

每个选项与另一个选项相比,还有哪些优点和/或缺点?

结束此问题的原因

在阅读了有关此内容的更多信息后,我意识到这是一个基于观点的问题,我将无法获得定量的答案。归结为Singleton vs Dependency Injection。已经广泛讨论了这一点,我已经阅读了有关何时使用和不使用每个参数的主要论点。我认为应该就将Hibernate配置为Singleton还是DI进行讨论,但是Stack Overflow并不是讨论的地方。问候。

1 个答案:

答案 0 :(得分:2)

Spring的创建者提出的大部分理由是,您经常希望能够交换配置以便于测试。分离代码和配置,并让框架将它们组合在一起,使测试变得更加容易,因为您无需编写特殊情况的代码即可在测试模式和生产模式之间进行切换。

如果您使用静态方式,则您的HibernateSessionFactory和用于创建它的配置都是硬编码的,或者您无法选择针对另一种实现进行测试,或者您必须编写自己的代码来实现。

>

如果使用spring-boot,则可以让不同的配置文件以不同的方式配置Hibernate。一个简单的例子是让Hibernate使用H2在本地运行和进行单元测试,并在其他位置使用一些非内存数据库。 Spring使您可以使用Java配置和注释声明性地指定这些内容。您可以指定哪些配置适用于哪些配置文件,并且在运行代码时可以将配置文件作为系统属性传递,或者注释测试以指示它们使用的配置文件。

在Spring-boot之前,您可以执行类似的操作,其中测试使用特定于测试的Java配置或context.xml。

使用Spring-Data JPA,您的大多数DAO都可以成为接口,您可以在其中利用现有的CrudRepository方法,或者在批注中包含一些自定义查询。 Spring为您处理了许多实现细节,比编写自己的DAO少得多。