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

标签 java spring hibernate jpa

到目前为止,我们一直只使用 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/

相关文章:

java - Spring xml 与 java 配置中的类类型注入(inject)

java - 由 : org. hibernate.exception.JDBCConnectionException 引起:调用 Driver#connect 时出错

java - hibernate 映射中可以选择哪种集合类型

java - GATE 数字、货币、金钱的标记注释

java - TarArchiveOutputStream 不归档隐藏文件

java - 第一个应用程序 - Random.nextInt() Unresolved 引用

java - 用户填充的 ListView 中的 TextView 值的总和

java - Vagrant:转发端口不起作用

spring - 访问静态资源时CORS错误

spring - 数据在没有保存的情况下保存在数据库中( hibernate )