优点与缺点 - HibernateUtil vs @Autowired SessionFactory

问题描述 投票:1回答:1

我试图更好地理解我们如何使用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不是讨论的地方。问候。

java hibernate autowired sessionfactory
1个回答
2
投票

Spring的创建者提出的理由很大一部分是,您经常希望能够更换配置以便于测试。分离代码和配置并让框架将它们组合在一起使测试变得更加容易,因为您不需要编写特殊的案例代码来在测试模式和prod模式之间切换。

如果您使用静态方式,您的HibernateSessionFactory和用于创建它的配置都是硬编码的,要么您没有选择针对其他实现进行测试,要么您必须编写自己的代码来执行此操作。

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

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

使用Spring-Data JPA,大多数DAO都可以成为可以利用预先存在的CrudRepository方法的接口,或者可能在注释中有一些自定义查询的接口。 Spring为您处理了很多实现细节,它比编写自己的DAO要少得多。

© www.soinside.com 2019 - 2024. All rights reserved.