我试图更好地理解我们如何使用Hibernate的利弊。我有一个HibernateUtil.java的经验,我调用它来建立/获取用于数据访问交互的会话。但是,我已经维护了一些应用程序,这些应用程序使用@Autowired属性来实现DAO中的SessionFactory。如果不是显而易见的话,我们将使用Spring。
下面是几个简单的例子,说明如何使用这些方法:
方法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和Dependency。这已被广泛讨论,我已经阅读了关于何时使用和不使用每种方法的主要论点。我认为应该将Hibernate配置为Singleton还是DI,需要进行讨论,但是Stack溢出不是讨论的地方。致以问候。
发布于 2019-03-14 15:55:45
Spring的创建者提出的一个很大的理由是,您经常希望能够将配置替换为简单的测试。将代码和配置分开,并让框架为您将它们组合在一起,可以使测试变得更加容易,因为您不需要编写特殊的用例代码来切换测试模式和prod模式。
如果您使用静态方式,您的HibernateSessionFactory和用于创建它的配置都是硬编码的,或者您没有针对另一个实现进行测试的选项,或者您必须编写自己的代码来实现它。
如果您使用spring-boot,您可以使用不同的配置文件配置Hibernate。一个简单的例子是让Hibernate使用H2在本地和单元测试中运行,并在其他地方使用一些非内存数据库。Spring允许您使用Java配置和注释声明地指定这些内容。您可以指定哪些配置文件适用于哪个配置文件,并且可以在运行代码时将配置文件作为系统属性传递,或者对测试进行注释以指示它们使用的配置文件。
在Spring之前,您可以执行类似的操作,其中测试使用特定于测试的或context.xml。
使用Spring,您的DAO中的大部分成为可以利用现有CrudRepository方法的接口,或者可以在注释中使用一些自定义查询。Spring为您处理了许多实现细节,它比编写您自己的DAO要少得多。
https://stackoverflow.com/questions/55150414
复制相似问题