对于 Spring Boot 项目 使用Hibernate

一、结论

对于 Spring Boot 项目:

text 复制代码
推荐:
EntityManager

不推荐:
HibernateTemplate

甚至可以说:

text 复制代码
Spring Boot + JPA
基本已经不再使用 HibernateTemplate

二、HibernateTemplate 是什么

来自:

java 复制代码
org.springframework.orm.hibernate3.HibernateTemplate

或者:

java 复制代码
org.springframework.orm.hibernate5.HibernateTemplate

属于 Spring 早期对 Hibernate 的封装。

当年(Spring2.x、Spring3.x)写法:

java 复制代码
public class UserDao {

    private HibernateTemplate hibernateTemplate;

    public void update(User user){
        hibernateTemplate.merge(user);
    }
}

当时的 Hibernate 原生代码:

java 复制代码
Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

session.merge(user);

tx.commit();

session.close();

代码比较繁琐。

所以 Spring 提供了:

java 复制代码
HibernateTemplate

帮你处理:

text 复制代码
获取Session
关闭Session
异常转换
事务同步

三、EntityManager 是什么

JPA标准接口:

java 复制代码
javax.persistence.EntityManager

Spring Boot 默认就是:

text 复制代码
Spring Data JPA
↓
EntityManager
↓
Hibernate

关系:

text 复制代码
EntityManager
      ↓
Hibernate Session

实际上:

java 复制代码
entityManager.merge(entity);

最终也是调用:

java 复制代码
Session.merge(entity);

四、merge() 本质区别

HibernateTemplate

源码(Hibernate3时代):

java 复制代码
hibernateTemplate.merge(entity)

内部:

java 复制代码
Session session = getSession();

session.merge(entity);

最后:

java 复制代码
return mergedObject;

EntityManager

java 复制代码
entityManager.merge(entity);

最终:

java 复制代码
Session.merge(entity);

所以从 Hibernate 角度:

text 复制代码
HibernateTemplate.merge
        =
EntityManager.merge
        =
Session.merge

最终执行逻辑几乎一样。


五、最大的区别

不是 merge 本身。

而是:

text 复制代码
整个框架体系

HibernateTemplate

依赖:

java 复制代码
SessionFactory

代码:

java 复制代码
@Autowired
private HibernateTemplate hibernateTemplate;

DAO风格:

java 复制代码
hibernateTemplate.save()

hibernateTemplate.update()

hibernateTemplate.merge()

hibernateTemplate.find()

典型老项目:

text 复制代码
Spring3
Hibernate3
Struts1
Struts2

EntityManager

依赖:

java 复制代码
@PersistenceContext
private EntityManager entityManager;

代码:

java 复制代码
entityManager.persist()

entityManager.merge()

entityManager.remove()

entityManager.find()

典型现代项目:

text 复制代码
Spring Boot
JPA
Hibernate5/6

六、Spring Boot 官方推荐

Spring Boot 官方路线:

text 复制代码
Repository
 ↓
JPA
 ↓
EntityManager
 ↓
Hibernate

例如:

java 复制代码
@Repository
public interface UserRepository
        extends JpaRepository<User,Long> {
}

底层就是:

java 复制代码
EntityManager

不是:

java 复制代码
HibernateTemplate

七、性能有区别吗

几乎没有。

例如:

java 复制代码
entityManager.merge(user);

最终:

java 复制代码
Session.merge(user);

java 复制代码
hibernateTemplate.merge(user);

最终:

java 复制代码
Session.merge(user);

执行 SQL:

sql 复制代码
update user set ...

完全一样。


八、Spring Boot 推荐哪种写法

推荐级别:

第一推荐

java 复制代码
JpaRepository

例如:

java 复制代码
public interface UserRepository
        extends JpaRepository<User,Long> {
}

第二推荐

java 复制代码
@PersistenceContext
private EntityManager entityManager;

复杂查询:

java 复制代码
entityManager.createQuery(...)

第三推荐

特殊场景:

java 复制代码
Session session =
    entityManager.unwrap(Session.class);

直接使用 Hibernate API:

java 复制代码
session.createQuery(...)

不推荐

java 复制代码
HibernateTemplate

原因:

text 复制代码
属于老Spring时代产物
JPA标准不兼容
Spring Boot生态基本不用
大量新特性不支持

九、如果是新项目

Spring Boot 3.x + Hibernate 6.x

推荐:

java 复制代码
@Service
@Transactional
public class UserService {

    @PersistenceContext
    private EntityManager entityManager;

    public void update(Long id){

        User user =
            entityManager.find(User.class,id);

        user.setUserName("张三");

        // 不需要 merge
        // 脏检查自动更新
    }
}

甚至:

java 复制代码
userRepository.save(user);

都可以省掉。

因为:

text 复制代码
Managed Entity
+
@Transactional
+
Dirty Checking

已经足够。


所以如果你的项目是:

text 复制代码
Spring Boot 2.x / 3.x
Hibernate 5.x / 6.x

建议优先使用:

java 复制代码
EntityManager

或者直接:

java 复制代码
JpaRepository

而不要再引入:

java 复制代码
HibernateTemplate
相关推荐
砍材农夫1 小时前
物联网实战:Spring Boot + Netty 搭建 MQTT平台 | 多协议适配与模块化设计
java·spring boot·后端·物联网·spring
Mr.45672 小时前
Netty中实现设备消息串行处理:Semaphore + 线程池
java·后端
copyer_xyf2 小时前
FastAPI 核心语法
后端·python
摇滚侠2 小时前
Spring 零基础入门到进阶 IOC 概述 11 - 13
java·后端·spring
李少兄2 小时前
Spring Boot Test 启动类自动发现机制解析与工程实践
java·spring boot·后端
不爱编程的小陈2 小时前
Go语言GMP调度模型深度解析:高并发背后的精妙设计
开发语言·后端·golang
骄马之死10 小时前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
GoGeekBaird11 小时前
Anthropic技能"(Skills)的经验分享
后端
王码码203511 小时前
多台服务器怎么统一看状态?Beszel 轻量监控,搭起来不费事
运维·服务器·后端·安全·阿里云·接口·web