对于 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
相关推荐
65岁退休Coder1 小时前
LangGraph v1.2.9 节点容错策略 & 流式输出 & 持久化记忆管理
后端·python·langchain
元界metalite3 小时前
SpringBoot整合RocketMQ-毒丸消息还要无限重试吗
后端
vipxieliang3 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing3 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
YIAN4 小时前
Docker + Nginx 核心原理扫盲:从环境隔离到反向代理,运维面试必考点
后端·docker·面试
万物智能4 小时前
启动链路与分区—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
后端·架构
寒蝉1284 小时前
一个简单操作是怎么在分布式环境下变复杂的
后端
苏三的开发日记4 小时前
Windows宿主机+VMware CentOS虚拟机 + 同一个Wi-Fi下的其他实体电脑,三者可以互相访问
后端
boooooooom4 小时前
手把手做一个图 RAG 烹饪问答系统:Neo4j + Milvus + LLM 的工程实践
前端·javascript·后端
newerp4 小时前
Golang 切片底层结构
后端·程序员·go