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