当前位置: 首页 > news >正文

Hibernate 速览指南

Hibernate 速览指南

什么是 Hibernate?

Hibernate 是一个开源的对象关系映射(ORM,Object-Relational Mapping)框架,由 Gavin King 于 2001 年创建。它主要用于 Java 应用程序,目的是简化数据库操作,让开发者能够使用面向对象的方式来操作关系型数据库,而不需要编写大量的 SQL 语句。

简单来说,Hibernate 充当了 Java 对象和数据库表之间的"翻译官",将 Java 类映射到数据库表,将对象的属性映射到表的列。

为什么需要 Hibernate?

在没有 ORM 框架之前,开发者需要:

  • 手写大量的 JDBC 代码
  • 手动处理结果集到对象的转换
  • 维护复杂的 SQL 语句
  • 处理数据库连接和事务管理

Hibernate 解决了这些痛点,让开发更加高效和优雅。

核心概念

1. ORM(对象关系映射)

ORM 是 Hibernate 的核心思想,它建立了以下映射关系:

  • Java 类数据库表
  • 对象实例表中的行
  • 对象属性表中的列

2. Session

Session 是 Hibernate 中最重要的接口之一,代表应用程序与数据库之间的一次会话。它负责:

  • 持久化对象的增删改查操作
  • 管理对象的生命周期
  • 维护一级缓存

Session 是轻量级的、非线程安全的,通常一个业务操作对应一个 Session。

3. SessionFactory

SessionFactory 是创建 Session 的工厂,具有以下特点:

  • 线程安全,应用程序中通常只需要一个实例
  • 创建成本高,应该在应用启动时创建
  • 内部维护二级缓存和连接池配置
  • 是不可变的(immutable)

4. 持久化类(Entity)

持久化类是需要映射到数据库的 Java 类,需要满足以下要求:

  • 提供无参构造函数
  • 提供标识符属性(ID)
  • 属性建议使用包装类型(Integer 而不是 int)
  • 实现 Serializable 接口(可选但推荐)
@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username", nullable = false, length = 50)private String username;private String email;// 构造函数、getter 和 setter
}

核心功能

1. 映射配置

Hibernate 支持两种映射方式:

XML 映射(传统方式):

<hibernate-mapping><class name="com.example.User" table="users"><id name="id" column="user_id"><generator class="identity"/></id><property name="username" column="username"/></class>
</hibernate-mapping>

注解映射(现代方式,推荐): 使用 JPA 注解如 @Entity@Table@Id@Column 等。

2. 对象状态

Hibernate 中的对象有四种状态:

  • 瞬时态(Transient):刚创建的对象,未与 Session 关联,数据库中没有对应记录
  • 持久态(Persistent):与 Session 关联,数据库中有对应记录,任何修改都会同步到数据库
  • 脱管态(Detached):曾经持久化过,但 Session 已关闭
  • 删除态(Removed):已标记为删除,等待数据库删除

3. 主键生成策略

Hibernate 支持多种主键生成策略:

  • IDENTITY:使用数据库的自增字段
  • SEQUENCE:使用数据库序列
  • TABLE:使用额外的表来生成主键
  • AUTO:由 Hibernate 自动选择合适的策略
  • UUID:生成 UUID 作为主键
  • ASSIGNED:手动分配主键值

4. 关联映射

Hibernate 支持所有 OOP 中的关联关系:

一对一(One-to-One):

@OneToOne
@JoinColumn(name = "profile_id")
private UserProfile profile;

一对多(One-to-Many):

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Order> orders;

多对一(Many-to-One):

@ManyToOne
@JoinColumn(name = "user_id")
private User user;

多对多(Many-to-Many):

@ManyToMany
@JoinTable(name = "user_roles",joinColumns = @JoinColumn(name = "user_id"),inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles;

5. 级联操作(Cascade)

级联操作允许对父对象的操作自动应用到关联的子对象:

  • CascadeType.PERSIST:保存父对象时保存子对象
  • CascadeType.MERGE:合并父对象时合并子对象
  • CascadeType.REMOVE:删除父对象时删除子对象
  • CascadeType.REFRESH:刷新父对象时刷新子对象
  • CascadeType.ALL:包含以上所有操作

6. 懒加载与急加载

懒加载(Lazy Loading): 默认策略,关联对象只在实际访问时才从数据库加载,可以提高性能但可能导致 N+1 查询问题。

急加载(Eager Loading): 立即加载关联对象,避免懒加载异常但可能影响性能。

@OneToMany(fetch = FetchType.LAZY)  // 懒加载
private List<Order> orders;@ManyToOne(fetch = FetchType.EAGER)  // 急加载
private User user;

查询方式

1. HQL(Hibernate Query Language)

面向对象的查询语言,类似 SQL 但操作的是对象:

String hql = "FROM User u WHERE u.username = :username";
Query query = session.createQuery(hql);
query.setParameter("username", "john");
List<User> users = query.list();

2. Criteria API

类型安全的查询方式:

CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> cr = cb.createQuery(User.class);
Root<User> root = cr.from(User.class);
cr.select(root).where(cb.equal(root.get("username"), "john"));
List<User> users = session.createQuery(cr).getResultList();

3. Native SQL

直接使用原生 SQL 查询:

String sql = "SELECT * FROM users WHERE username = :username";
Query query = session.createNativeQuery(sql, User.class);
query.setParameter("username", "john");
List<User> users = query.list();

缓存机制

一级缓存(Session 缓存)

  • 默认开启,无法关闭
  • Session 级别,生命周期与 Session 相同
  • 减少同一 Session 内的重复数据库访问

二级缓存(SessionFactory 缓存)

  • 需要手动配置
  • SessionFactory 级别,可跨 Session 共享
  • 常用实现:EhCache、Redis、Infinispan
  • 适合读多写少的数据

查询缓存

  • 缓存查询结果
  • 需要配合二级缓存使用
  • 对结果集的缓存

事务管理

Hibernate 事务管理方式:

Session session = sessionFactory.openSession();
Transaction tx = null;
try {tx = session.beginTransaction();// 执行数据库操作session.save(user);tx.commit();
} catch (Exception e) {if (tx != null) tx.rollback();throw e;
} finally {session.close();
}

性能优化技巧

  1. 合理使用懒加载:避免一次性加载大量不需要的数据
  2. 批量操作:使用批处理提高大量数据的插入/更新效率
  3. 使用连接池:如 HikariCP、C3P0
  4. 启用二级缓存:对热点数据进行缓存
  5. 避免 N+1 问题:使用 JOIN FETCH 或批量加载
  6. 使用投影查询:只查询需要的字段
  7. 定期清理 Session:防止一级缓存占用过多内存

常见问题

N+1 查询问题

当加载一个包含集合的实体时,可能导致额外的 N 次查询。解决方案:

  • 使用 JOIN FETCH
  • 启用批量加载(@BatchSize)
  • 使用二级缓存

LazyInitializationException

在 Session 关闭后访问懒加载属性会抛出此异常。解决方案:

  • 在 Session 开启时访问所需属性
  • 使用急加载
  • 使用 Open Session In View 模式(不推荐)

Hibernate 与 JPA 的关系

JPA(Java Persistence API)是 Java EE 的持久化规范,Hibernate 是 JPA 的一个实现(最流行的实现)。Hibernate 既支持 JPA 标准注解,也提供了自己的扩展功能。

总结

Hibernate 是一个功能强大的 ORM 框架,它极大地简化了 Java 应用程序与数据库的交互。掌握 Hibernate 的核心概念、映射配置、查询方式和缓存机制,能够帮助开发者构建高效、可维护的数据访问层。随着 Spring Data JPA 的流行,Hibernate 作为底层实现仍然是 Java 持久化技术栈中不可或缺的一部分。

http://www.dtcms.com/a/573075.html

相关文章:

  • 凡科网站建设步骤企业年金查询
  • AssertJ,让断言更流畅的Java测试库!
  • C++:大型语言模型与智能系统底座的隐形引擎
  • 你好,未来:零基础看懂大语言模型
  • Spring Boot 多线程文件复制服务(支持大文件流式/NIO复制、失败重试、覆盖写入)
  • 当视觉语言模型接收到相互矛盾的信息时,它会相信哪个信号?
  • 软考中级习题与解答——UML中主要关系
  • 公司做网站属于什么费用wordpress 加入页面
  • 以太网帧格式、IP数据报头部、TCP头部、UDP头部
  • CRMEB标准版小票打印功能详解
  • Java开发性能优化
  • 传输层最重要的两种协议——UDP与TCP的区别(TCP可靠但是慢,UDP不可靠但是快)
  • list(带头双向循环链表)
  • Linux的例行工作
  • Java List全面解析:从入门到精通
  • 英文网站如何做关键词怎样免费注册自己网站的域名
  • Win11卸载重装oracle 11g数据库
  • 模拟电路-工程实践-磁珠的使用方法
  • verilog中数据类型real
  • 如何选择适合的单北斗GNSS变形监测解决方案?
  • 使用vue获取url上的参数
  • kuwa_technology
  • 昭和仙君(五十六)标签票据打印模板设计分列打印——东方仙盟筑基期
  • 亿赐客网站怎么样营销型网站特点
  • 网站开发工具的选择wordpress 主题 更改
  • JavaSe—Map集合
  • B.40.3.2-MyBatis核心技术详解与性能优化
  • 【微服务】SpringBoot 4.0 新特性整合项目实战应用详解
  • 小说网站开发需求搭建三合一网站
  • 成都网站优化及推广微信网页游戏大全