### Hibernate参考文档知识点详解
#### 一、概述
**Hibernate** 是一款开源的对象关系映射(Object Relational Mapping,简称ORM)工具,它允许开发者将Java应用中的对象映射到数据库中的表,从而实现了Java应用与关系型数据库之间的无缝交互。这种映射不仅简化了数据持久化的逻辑,而且提高了开发效率。
#### 二、重要知识点详解
##### 1. 创建注解项目
- **系统需求**:
- Java环境:确保安装了JDK并配置好环境变量。
- IDE支持:推荐使用如IntelliJ IDEA或Eclipse等现代IDE,这些IDE提供了强大的Hibernate支持。
- Hibernate库:确保项目中包含最新的Hibernate库文件。
- **系统配置**:
- 配置persistence.xml文件来定义数据源、事务管理器以及实体映射文件的位置等。
- 在pom.xml或build.gradle中添加必要的依赖。
##### 2. 实体Bean
- **简介**:实体Bean是Java应用中的核心概念之一,用于表示数据库中的行。
- **用EJB3注解进行映射**:
- **声明实体Bean**:
- 使用`@Entity`注解来标记一个类作为实体Bean。
- 可选地使用`@Table(name = "tableName")`来指定该实体映射到的表名。
- **乐观锁定版本控制**:通过`@Version`注解实现乐观锁机制,通常用于并发控制。
- **映射简单属性**:
- **声明基本属性映射**:使用`@Column`注解来指定列的细节。
- **声明列属性**:例如`@Column(nullable = false)`确保字段不可为空。
- **嵌入式对象**(即组件):使用`@Embedded`和`@EmbeddedId`注解来表示非独立的实体或主键。
- **无注解时的属性默认值**:Hibernate会自动映射未注解的属性,但建议明确指定以提高代码可读性和维护性。
- **映射主键属性**:使用`@Id`注解标记主键属性,并可以结合`@GeneratedValue`来设置主键生成策略。
- **映射继承关系**:
- **每个类一张表**:每个子类都映射到各自的表中。
- **每个类层次结构一张表**:所有类共享同一张表,使用`@DiscriminatorColumn`区分不同的子类。
- **连接的子类**:除了共享一张表之外,每个子类还拥有自己的额外表。
- **从父类继承的属性**:使用`@Inheritance(strategy = InheritanceType.SINGLE_TABLE)`等策略。
- **映射实体Bean的关联关系**:
- **一对一(One-to-one)**:使用`@OneToOne`注解。
- **多对一(Many-to-one)**:使用`@ManyToOne`注解。
- **集合类型**:包括List、Set等集合,使用`@ElementCollection`或`@OneToMany`/`@ManyToMany`等注解。
- **传播性持久化**:通过`cascade`属性实现,例如`@OneToMany(cascade = CascadeType.ALL)`。
- **映射复合主键与外键**:利用`@EmbeddedId`和`@MapsId`注解来实现。
- **映射二级表(secondary tables)**:使用`@SecondaryTables`注解来指定多个二级表。
- **映射查询**:
- **EJBQL/HQL查询**:使用`@NamedQuery`注解。
- **本地化查询**:通过`@SQL`注解实现原生SQL查询。
- **Hibernate独有的注解扩展**:
- **实体**:`@Entity`。
- **标识符**:`@Id`。
- **属性**:
- **访问类型**:`@Access`。
- **公式**:`@Formula`。
- **类型**:`@Type`。
- **索引**:`@Index`。
- `@Parent`:表示实体属于哪个父容器。
- **生成的属性**:`@Generated`。
- **继承**:`@Inheritance`。
- **关于单个关联关系的注解**:
- **延迟选项和获取模式**:`@Fetch`。
- **关于集合类型的注解**:
- **参数注解**:如`@OrderColumn`。
- **更多的集合类型**:如`@Bag`、`@MapKey`等。
- **缓存**:使用`@Cache`注解。
- **过滤器**:使用`@Filter`注解。
- **查询**:使用`@NamedQuery`或`@NamedNativeQuery`注解。
##### 3. 通过XML覆写元数据
- **原则**:
- **全局级别的元数据**:在hibernate.cfg.xml中定义。
- **实体级别的元数据**:在实体类的XML映射文件中定义。
- **属性级别的元数据**:同样在XML映射文件中定义。
- **关联级别的元数据**:也在XML映射文件中定义。
##### 4. Hibernate验证器
- **约束**:
- **什么是约束?**:约束是用来确保数据完整性的规则。
- **内建约束**:如`@NotNull`、`@Size`等。
- **错误信息**:可以通过`message`属性自定义错误消息。
- **编写你自己的约束**:实现`ConstraintValidator`接口。
- **注解你的领域模型**:使用约束注解来增强实体类。
- **使用验证器框架**:
- **数据库schema层次验证**:在DDL生成阶段检查。
- **Hibernate基于事件的验证**:在持久化操作时触发验证。
- **程序级验证**:通过编程方式在业务逻辑中实现。
- **验证信息**:用于展示验证失败的具体信息。
##### 5. Hibernate与Lucene集成
- **使用Lucene为实体建立索引**:
- **注解领域模型**:使用`@Indexed`注解。
- **启用自动索引**:通过配置`@FullTextEntityManager`等来实现全文搜索功能。
#### 三、总结
本篇文档深入探讨了Hibernate的多个关键概念和技术细节,从创建注解项目到实体Bean的定义、再到复杂的关联关系映射、查询映射、验证器的使用以及与Lucene的集成,全面覆盖了开发者在使用Hibernate过程中可能遇到的主要知识点。通过掌握这些知识点,开发者能够更高效地使用Hibernate进行数据持久化操作。