对于 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
相关推荐
武子康4 小时前
调查研究-201 Rust 里的 dev build 和 release build:为什么同一份代码性能差这么多?
后端·架构·rust
石小石Orz4 小时前
AI具身交互:实现一个会说话的3D虚拟伴侣
前端·人工智能·后端
Ai拆代码的曹操4 小时前
容器 CPU Throttling 有多坑?K8s CFS 限制让 P99 慢了 16 倍
后端
夕阳与风馨4 小时前
大文件(20GB+)SFTP 下载模块设计与实现
后端·架构
Flittly4 小时前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
Dilee4 小时前
Spring AI 2.0.0 接 Skill 最小 Demo:SkillsTool 加载 SKILL.md 一次跑通
后端
zoulee244 小时前
doris-python:让 SQLAlchemy 玩转 Apache Doris 多驱动生态
后端
RainCity4 小时前
Java Swing 自定义组件库分享(十二)
java·笔记·后端
Csvn5 小时前
Linux 系统性能监控与瓶颈排查
后端