gpt4 book ai didi

java - 与单独使用 Hibernate 相比,将 Hibernate 与 Spring 结合使用有什么区别吗?

转载 作者:行者123 更新时间:2023-12-01 23:11:59 25 4
gpt4 key购买 nike

到目前为止,我们一直只使用 Hibernate - 我正在转向 JPA。我们的项目中使用Spring作为MVC。它们完全分开使用。

我检查了带有 Hibernate JPA 实现的新 Spring 4.0 Petclinic 项目 ( https://github.com/SpringSource/spring-petclinic.git )。我再次没有看到 Spring 对 Hibernate 代码的影响。例如,除了 @Repository 注释之外,JpaPetRepositoryImpl 在没有 Spring 的情况下使用。我错过了什么吗?

最佳答案

Spring 的重点是尽可能不干扰您的代码,您应该在代码中看到尽可能少的 Spring。基本上这就是 Spring 的全部要点和目标。

当您通常在没有 spring 的情况下使用 hibernate 时,您将拥有某种构造 hibernate SessionFactory 的单例。

public class HibernateUtil {

private static SessionFactory sf;

static {
sf = ew Configuration().configure().buildSessionFactory();
}

public static getSessionFactory() {
return sf;
}

}

接下来您将看到的是调用 HibernateUtils.getSesionFactory() 的代码。您需要手动创建 session 并启动/提交事务。

public void save(Entity e) {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
try {
session.save(e);
tx.commit();
} catch (HIbernateException he) {
tx.rollback();
} finally {
session.close();
}
}

但是,由于两个原因,该代码很糟糕。首先,您手动管理事务,一段时间后会变得很痛苦,您想使用声明式事务管理。如果您在错误的层管理事务,则应该在服务层管理事务。现在,为了实现这一点,您必须在服务层中获取 SessionFactory ,这会突然将数据访问层变成一个有漏洞的抽象。

Spring 可以帮助您完成这两件事,它可以进行声明式 tx 管理并隐藏您正在使用 Hibernate 的事实,而不是使其成为一个有漏洞的抽象。

@Inject
private SessionFactory sf;

public void save(Entity e) {
sf.getCurrentSession().save(e);
}

这在 Spring 方式中是相同的。事务将在服务级别启动(使用 @Transactional 或 @TransactionAttributes 注释)。

对于 JPA 来说,这或多或少是相同的,但是由于 JPA 是一个标准,Spring 尝试尽可能地遵循这些标准。因此,普通 JPA 代码和 Spring 中的 JPA 代码没有太大区别(除非您在独立应用程序中使用 JPA 而不是 JEE 容器,否则 JPA 代码将类似于 Hibernate 代码)。

关于java - 与单独使用 Hibernate 相比,将 Hibernate 与 Spring 结合使用有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21792476/

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