java - 优点 vs 缺点 - HibernateUtil vs @Autowired SessionFactory
问题描述
我试图更好地理解我们如何使用 Hibernate 的利弊。我有一个 HibernateUtil.java 的经验,我在其中调用以建立/获取用于数据访问交互的会话。但是,我维护了利用 @Autowired 属性在 DAO 中实现 SessionFactory 的应用程序。如果不是很明显,我们使用的是 Spring MVC。
以下是一些如何使用它们的简要示例:
方法一
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 的实例以访问它的方法,还是您更喜欢使用静态方法?
每个选项与另一个选项相比还有哪些其他优点和/或缺点?
关闭此问题的原因
在阅读了更多关于此的内容后,我意识到这是一个基于意见的问题,我不会得到定量的答案。这归结为单例与依赖注入。这已被广泛讨论,我已经阅读了关于何时使用和不使用每个的主要论点。我认为应该讨论 Hibernate 是否应该配置为 Singleton 或 DI,但 Stack Overflow 不是讨论的地方。问候。
解决方案
Spring 的创建者提出的大部分理由是,您经常希望能够更换配置以便于测试。分离代码和配置并让框架为您将它们放在一起使测试变得更加容易,因为您不需要编写特殊情况代码来在测试模式和生产模式之间切换。
如果您使用静态方式,您的 HibernateSessionFactory 和用于创建它的配置是硬编码的,并且您无法选择针对另一个实现进行测试,或者您必须编写自己的代码来执行此操作。
如果你使用 spring-boot,你可以让不同的配置文件以不同的方式配置 Hibernate。一个简单的例子是让 Hibernate 使用 H2 在本地运行和单元测试,并在其他地方使用一些非内存数据库。Spring 允许您使用 Java 配置和注释以声明方式指定这些内容。您可以指定哪些配置适用于哪些配置文件,并且您可以在运行代码时将配置文件作为系统属性传递,或者注释您的测试以指示它们使用的配置文件。
Pre-Spring-boot 您可以做类似的事情,其中测试使用特定于测试的 Java 配置或 context.xml。
使用 Spring-Data JPA,您的大多数 DAO 都成为接口,您可以在其中利用预先存在的 CrudRepository 方法,或者在注释中可能有一些自定义查询。Spring 为您处理了很多实现细节,它比编写自己的 DAO 工作量要少得多。
推荐阅读
- c# - 将 double 转换为 long 更改值
- javascript - React-select:react-table 过滤器单元格内部看起来很奇怪,是 CSS 的问题吗?
- javascript - 如何根据某个属性的值将元素数组拆分为组?
- c# - 序列化嵌套对象时的自引用
- python - 如何按月而不是按日过滤现有查询集
- liquibase - 我可以更改 liquibase 源代码并尝试使其适用于 db2 z/os generateChangeLog 吗?
- c# - 使用 C# 从 Excel 中显示数据
- javascript - momentjs 如何处理月份或年份的加法或减法
- linux - x64 linux上的Shellcode注入
- php - htaccess 和 wordpress 配置文件经常被覆盖