Hibernate 是 Java 持久化领域的核心框架,通过对象关系映射(ORM)技术,将 Java 对象与关系型数据库中的表相互映射。这种映射使得开发者能够使用面向对象的方法来处理数据,而不必编写复杂的 SQL 语句。Hibernate 提供了一系列注解,如 @Entity 用于标识实体类, @Table 用于指定实体与数据库表的映射, @Id 用于标记实体的主键字段,以及 @Column 用于定义实体属性与数据库表列的映射关系。 此外, @ManyToOne、 @OneToMany 和 @ManyToMany 注解用于表达实体之间的关系,而 @JoinColumn 用于指定关系映射中的外键列。高级特性如 @Cache 注解用于配置
肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注
欢迎 点赞,关注,评论。
关注公号Solomon肖哥弹架构获取更多精彩内容
历史热点文章
- 个验证注解,通过业务案例让你精通Java数据校验(收藏篇)
- Java 8函数式编程全攻略:种函数式业务代码实战案例解析(收藏版)
- 个Spring mvc 全部注解:真实业务使用案例说明(必须收藏)
- 个Spring bean 全部注解:真实业务使用案例说明(必须收藏)
- MySQL索引完全手册:真实业务图文讲解种索引运用技巧(必须收藏)
- 一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
hibernate 架构图
在这个图表中:
- ORM 组包含了 Hibernate 框架的核心组件,如配置文件、数据源、事务管理和缓存。
- Data Access 组描述了 Hibernate 会话、事务和持久化上下文,这些是进行数据访问和操作的主要接口。
- Mapping 组展示了持久化类、实体、主键、属性、关联和表之间的映射关系。
- Strategy 组包含了 Hibernate 的事务策略和缓存策略,这些定义了 Hibernate 的行为和性能优化。
1. 实体和表映射注解
@Entity
- 注解作用介绍
用于标记一个类作为JPA实体。
- 注解属性介绍
无特定属性。
- 注解业务案例
@Entity
public class User {
// 实体类字段和方法
}
- 注解使用效果: 使用 @Entity后,MyBatis Plus和Hibernate会将该类识别为一个实体,可以进行数据库操作。
@Table
- 注解作用介绍
用于指定实体与数据库表的映射。
- 注解属性介绍name: 指定实体对应的数据库表名。
- 注解业务案例
@Entity
@Table(name = user_table)
public class User {
// 实体类字段和方法
}
- 注解使用效果: 使用 @Table后,MyBatis Plus和Hibernate会将该实体映射到指定的数据库表。
2. 主键和生成策略注解
@Id
- 注解作用介绍
用于标记实体的主键字段。
- 注解属性介绍
无特定属性。
- 注解业务案例
public class User {
@Id
private Long id;
// 其他字段和方法
}
- 注解使用效果: 使用 @Id后,MyBatis Plus和Hibernate会将该字段识别为实体的主键。
@GeneratedValue
- 注解作用介绍
用于指定主键的生成策略。
- 注解属性介绍strategy: 指定生成策略,如 GenerationType.AUTO。
- 注解业务案例
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 其他字段和方法
}
- 注解使用效果: 使用 @GeneratedValue后,MyBatis Plus和Hibernate会根据指定的策略生成主键值。
3. 属性和列映射注解
@Column
- 注解作用介绍
用于指定实体属性与数据库表列的映射。
- 注解属性介绍name: 指定数据库表的列名。
- 注解业务案例
public class User {
private Long id;
@Column(name = user_name)
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @Column后,MyBatis Plus和Hibernate会将该字段映射到指定的数据库表列。
@Basic
- 注解作用介绍
用于映射基本数据类型的属性。
- 注解属性介绍fetch: 指定加载策略,如 FetchType.LAZY。
- 注解业务案例
public class User {
private Long id;
@Basic(fetch = FetchType.LAZY)
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @Basic后,MyBatis Plus和Hibernate会根据指定的加载策略加载该字段。
@Enumerated
- 注解作用介绍
用于映射枚举类型的属性。
- 注解属性介绍value: 指定枚举值的类型。
- 注解业务案例
public enum Gender {
MALE, FEMALE
}
public class User {
private Long id;
@Enumerated(EnumType.STRING)
private Gender gender;
// 其他字段和方法
}
- 注解使用效果: 使用 @Enumerated后,MyBatis Plus和Hibernate会将枚举值映射为指定的类型。
@Transient
- 注解作用介绍
用于标记非持久化字段。
- 注解属性介绍
无特定属性。
- 注解业务案例
public class User {
private Long id;
@Transient
private String temporaryData;
// 其他字段和方法
}
- 注解使用效果: 使用 @Transient后,MyBatis Plus和Hibernate不会将该字段持久化到数据库。
@Embedded
- 注解作用介绍
用于将一个类嵌入到另一个实体中。
- 注解属性介绍
无特定属性。
- 注解业务案例
public class Address {
private String street;
private String city;
}
public class User {
private Long id;
@Embedded
private Address address;
// 其他字段和方法
}
- 注解使用效果: 使用 @Embedded后,MyBatis Plus和Hibernate会将嵌入的类作为实体的一部分进行持久化。
4. 关联和关系注解
@ManyToOne
- 注解作用介绍
用于标记实体与另一个实体的多对一关系。
- 注解属性介绍targetEntity: 指定关联实体的类型。
- 注解业务案例
public class User {
@Id
private Long id;
@ManyToOne
private Department department;
// 其他字段和方法
}
- 注解使用效果: 使用 @ManyToOne后,MyBatis Plus和Hibernate会将该字段识别为多对一关系,并进行相应的数据库操作。
@OneToMany
- 注解作用介绍
用于标记实体与另一个实体的一对多关系。
- 注解属性介绍mappedBy: 指定对方实体中用于映射当前实体的属性名。
- 注解业务案例
public class Department {
@Id
private Long id;
@OneToMany(mappedBy = department)
private List<User> users;
// 其他字段和方法
}
- 注解使用效果: 使用 @OneToMany后,MyBatis Plus和Hibernate会将该字段识别为一对多关系,并进行相应的数据库操作。
@ManyToOne
- 注解作用介绍
用于标记实体与另一个实体的多对一关系。
- 注解属性介绍targetEntity: 指定关联实体的类型。
- 注解业务案例
public class User {
@Id
private Long id;
@ManyToOne
private Department department;
// 其他字段和方法
}
- 注解使用效果: 使用 @ManyToOne后,MyBatis Plus和Hibernate会将该字段识别为多对一关系,并进行相应的数据库操作。
@ManyToMany
- 注解作用介绍
用于标记实体与另一个实体的多对多关系。
- 注解属性介绍targetEntity: 指定关联实体的类型。mappedBy: 指定对方实体中用于映射当前实体的属性名。
- 注解业务案例
public class User {
@Id
private Long id;
@ManyToMany
private List<Role> roles;
// 其他字段和方法
}
- 注解使用效果: 使用 @ManyToMany后,MyBatis Plus和Hibernate会将该字段识别为多对多关系,并进行相应的数据库操作。
@JoinColumn
- 注解作用介绍
用于指定关系映射中的外键列。
- 注解属性介绍name: 指定外键列的名称。
- 注解业务案例
public class User {
@Id
private Long id;
@ManyToOne
@JoinColumn(name = department_id)
private Department department;
// 其他字段和方法
}
- 注解使用效果: 使用 @JoinColumn后,MyBatis Plus和Hibernate会将该字段映射到指定的外键列。
5. 高级映射注解
@AttributeOverride
- 注解作用介绍
用于覆盖继承实体中的属性映射。
- 注解属性介绍name: 指定要覆盖的属性名称。column: 指定新的列映射。
- 注解业务案例
public class BaseEntity {
private Long id;
}
public class User extends BaseEntity {
@AttributeOverride(name = id, column = @Column(name = user_id))
private Long id;
// 其他字段和方法
}
- 注解使用效果: 使用 @AttributeOverride后,MyBatis Plus和Hibernate会使用指定的列映射覆盖继承实体中的属性。
@AssociationOverride
- 注解作用介绍
用于覆盖继承实体中的关联属性映射。
- 注解属性介绍name: 指定要覆盖的关联属性名称。joinColumns: 指定新的关联列映射。
- 注解业务案例
public class BaseEntity {
private Department department;
}
public class User extends BaseEntity {
@AssociationOverride(name = department, joinColumns = @JoinColumn(name = user_department_id))
private Department department;
// 其他字段和方法
}
- 注解使用效果: 使用 @AssociationOverride后,MyBatis Plus和Hibernate会使用指定的关联列映射覆盖继承实体中的关联属性。
@SecondaryTable
- 注解作用介绍
用于映射实体到多个表。
- 注解属性介绍name: 指定第二个表的名称。
- 注解业务案例
@Entity
@SecondaryTable(name = user_details, pkJoinColumns = @PrimaryKeyJoinColumn(name = user_id))
public class User {
@Id
private Long id;
// 其他字段和方法
}
- 注解使用效果: 使用 @SecondaryTable后,MyBatis Plus和Hibernate会将该实体映射到多个表。
@PrimaryKeyJoinColumn
- 注解作用介绍
用于映射复合主键中的外键。
- 注解属性介绍name: 指定外键列的名称。
- 注解业务案例
@Entity
@Table(name = order_line)
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name = order_id, referencedColumnName = id),
@PrimaryKeyJoinColumn(name = line_id, referencedColumnName = lineId)
})
public class OrderLine {
// 实体类字段和方法
}
- 注解使用效果: 使用 @PrimaryKeyJoinColumn后,MyBatis Plus和Hibernate会将该字段映射为复合主键的一部分。
6. 查询和缓存注解
@Query
- 注解作用介绍
用于定义命名查询。
- 注解属性介绍value: 指定查询的SQL语句。
- 注解业务案例
public interface UserMapper {
@Query(SELECT u FROM User u WHERE u.id = #{id})
User findUserById(@Param(id) Long id);
}
- 注解使用效果: 使用 @Query后,MyBatis Plus和Hibernate会执行指定的SQL查询。
@NamedQueries
- 注解作用介绍
用于定义多个命名查询。
- 注解属性介绍value: 指定命名查询的数组。
- 注解业务案例
@NamedQueries({
@NamedQuery(name = User.findAll, query = SELECT u FROM User u),
@NamedQuery(name = User.findByName, query = SELECT u FROM User u WHERE u.name = #{name})
})
public class User {
// 实体类字段和方法
}
- 注解使用效果: 使用 @NamedQueries后,MyBatis Plus和Hibernate可以执行定义的多个命名查询。
@Cacheable
- 注解作用介绍
用于指定实体的缓存策略。
- 注解属性介绍value: 指定缓存的名称。
- 注解业务案例
public interface UserMapper {
@Cacheable(userCache)
User findUserById(@Param(id) Long id);
}
- 注解使用效果: 使用 @Cacheable后,MyBatis Plus和Hibernate会将查询结果缓存到指定的缓存中。
7. 动态SQL和结果集注解
@SqlResultSetMapping
- 注解作用介绍
用于定义SQL结果集与实体类的映射。
- 注解属性介绍name: 指定结果集映射的名称。
- 注解业务案例
public interface UserMapper {
@SqlResultSetMapping(name = userMapping)
@Select(SELECT id, name, age FROM users WHERE id = #{id})
User findUserById(@Param(id) Long id);
}
- 注解使用效果: 使用 @SqlResultSetMapping后,MyBatis Plus和Hibernate会将SQL查询结果映射到指定的实体类。
@Where
- 注解作用介绍
用于在实体类级别添加条件约束。
- 注解属性介绍clause: 指定条件表达式。
- 注解业务案例
public class User {
@Id
private Long id;
@Where(clause = status = ACTIVE)
private String status;
// 其他字段和方法
}
- 注解使用效果: 使用 @Where后,MyBatis Plus和Hibernate会在查询时自动应用指定的条件。
8. 继承和策略注解
@DiscriminatorColumn
- 注解作用介绍
用于映射继承结构中的类标识符。
- 注解属性介绍name: 指定类标识符的列名。
- 注解业务案例
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = type)
public class BaseEntity {
@Id
private Long id;
// 其他字段和方法
}
- 注解使用效果: 使用 @DiscriminatorColumn后,MyBatis Plus和Hibernate会在单表继承结构中使用指定的列作为类标识符。
@DiscriminatorValue
- 注解作用介绍
用于指定实体在继承结构中的值。
- 注解属性介绍value: 指定实体的值。
- 注解业务案例
@Entity
@DiscriminatorValue(USER)
public class User extends BaseEntity {
// 实体类字段和方法
}
- 注解使用效果: 使用 @DiscriminatorValue后,MyBatis Plus和Hibernate会在继承结构中使用指定的值来区分实体。
9. 特殊功能注解
@Convert
- 注解作用介绍
用于指定属性转换器。
- 注解属性介绍converter: 指定转换器的类。
- 注解业务案例
public class User {
@Convert(converter = CustomDateConverter.class)
private Date birthDate;
// 其他字段和方法
}
- 注解使用效果: 使用 @Convert后,MyBatis Plus和Hibernate会在读写属性时使用指定的转换器。
@Access
- 注解作用介绍
用于指定实体属性的访问策略。
- 注解属性介绍value: 指定访问策略,如 AccessType.FIELD。
- 注解业务案例
public class User {
@Id
@Access(AccessType.FIELD)
private Long id;
// 其他字段和方法
}
- 注解使用效果: 使用 @Access后,MyBatis Plus和Hibernate会根据指定的访问策略访问实体属性。
@BatchSize
- 注解作用介绍
用于指定批量操作的批处理大小。
- 注解属性介绍size: 指定批处理的大小。
- 注解业务案例
public interface UserMapper {
@BatchSize(size = )
int insertBatchSelective(List<User> users);
}
- 注解使用效果: 使用 @BatchSize后,MyBatis Plus和Hibernate会在执行批量操作时使用指定的批处理大小。
. Hibernate特有注解
@NaturalId
- 注解作用介绍
用于指定实体的自然标识符。
- 注解属性介绍mutable: 指定标识符是否可变。
- 注解业务案例
public class User {
@Id
private Long id;
@NaturalId
private String email;
// 其他字段和方法
}
- 注解使用效果: 使用 @NaturalId后,Hibernate会将该字段识别为自然标识符,并提供优化的加载性能。
@Immutable
- 注解作用介绍
用于标记实体为不可变。
- 注解属性介绍
无特定属性。
- 注解业务案例
@Entity
@Immutable
public class User {
@Id
private Long id;
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @Immutable后,Hibernate会将该实体识别为不可变,优化性能。
@DynamicInsert
- 注解作用介绍
用于动态生成INSERT语句。
- 注解属性介绍
无特定属性。
- 注解业务案例
@Entity
@DynamicInsert
public class User {
@Id
private Long id;
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @DynamicInsert后,Hibernate会动态生成INSERT语句,减少不必要的字段更新。
@DynamicUpdate
- 注解作用介绍
用于动态生成UPDATE语句。
- 注解属性介绍
无特定属性。
- 注解业务案例
@Entity
@DynamicUpdate
public class User {
@Id
private Long id;
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @DynamicUpdate后,Hibernate会动态生成UPDATE语句,减少不必要的字段更新。
@SelectBefore
- 注解作用介绍
用于在更新或删除操作之前执行自定义的SQL查询。
- 注解属性介绍statement: 指定自定义的SQL查询语句。
- 注解业务案例
@Entity
@SelectBefore(statement = SELECT * FROM users WHERE id = #{id})
public class User {
@Id
private Long id;
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @SelectBefore后,Hibernate会在更新或删除操作之前执行指定的SQL查询。
@FilterDef
- 注解作用介绍
用于定义动态过滤条件。
- 注解属性介绍name: 指定过滤器的名称。
- 注解业务案例
@FilterDef(name = activeUsers, defaultOverride = @FilterParam(name = status, value = active))
public class User {
@Id
private Long id;
private String name;
private String status;
// 其他字段和方法
}
- 注解使用效果: 使用 @FilterDef后,Hibernate会定义动态过滤条件,可以在查询时使用。
@Filter
- 注解作用介绍
用于在实体类上应用动态过滤条件。
- 注解属性介绍name: 指定过滤器的名称。
- 注解业务案例
@Entity
@Filter(name = activeUsers)
public class User {
@Id
private Long id;
private String name;
private String status;
// 其他字段和方法
}
- 注解使用效果: 使用 @Filter后,Hibernate会在查询时应用指定的动态过滤条件。
@FilterJoinTable
- 注解作用介绍
用于定义动态过滤条件的关联表。
- 注解属性介绍name: 指定关联表的名称。
- 注解业务案例
@Entity
@FilterJoinTable(name = user_roles, joinColumns = @JoinColumn(name = user_id))
public class User {
@Id
private Long id;
private String name;
private String status;
// 其他字段和方法
}
- 注解使用效果: 使用 @FilterJoinTable后,Hibernate会在查询时应用指定的关联表动态过滤条件。
@LazyCollection
- 注解作用介绍
用于指定集合的懒加载策略。
- 注解属性介绍value: 指定懒加载的类型,如 LazyCollectionOption.TRUE。
- 注解业务案例
public class User {
@Id
private Long id;
@LazyCollection(value = LazyCollectionOption.EXTRA)
private Set<Role> roles;
// 其他字段和方法
}
- 注解使用效果: 使用 @LazyCollection后,Hibernate会根据指定的策略懒加载集合。
@Synchronize
- 注解作用介绍
用于在分布式环境中同步数据。
- 注解属性介绍value: 指定同步的实体类。
- 注解业务案例
@Entity
@Synchronize(value = users)
public class User {
@Id
private Long id;
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @Synchronize后,Hibernate会在分布式环境中同步指定的实体数据。
@TypeDef
- 注解作用介绍
用于定义自定义的类型。
- 注解属性介绍typeClass: 指定自定义类型的类。
- 注解业务案例
@Entity
@TypeDef(typeClass = CustomType.class)
public class User {
@Id
private Long id;
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @TypeDef后,Hibernate会使用指定的自定义类型进行数据持久化。
@GenericGenerator
- 注解作用介绍
用于指定自定义的生成策略。
- 注解属性介绍name: 指定生成器的名称。strategy: 指定生成策略的类。
- 注解业务案例
@Entity
@GenericGenerator(name = customGenerator, strategy = com.example.CustomGenerator)
public class User {
@Id
@GeneratedValue(generator = customGenerator)
private Long id;
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @GenericGenerator后,Hibernate会使用指定的自定义生成策略生成主键值。
@CreationTimestamp
- 注解作用介绍
用于自动设置创建时间戳。
- 注解属性介绍column: 指定存储时间戳的列名。
- 注解业务案例
@Entity
public class User {
@Id
private Long id;
@CreationTimestamp
private LocalDateTime created;
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @CreationTimestamp后,Hibernate会在实体创建时自动设置指定列的创建时间戳。
@UpdateTimestamp
- 注解作用介绍
用于自动设置更新时间戳。
- 注解属性介绍column: 指定存储时间戳的列名。
- 注解业务案例
@Entity
public class User {
@Id
private Long id;
@UpdateTimestamp
private LocalDateTime updated;
private String name;
// 其他字段和方法
}
- 注解使用效果: 使用 @UpdateTimestamp后,Hibernate会在实体更新时自动设置指定列的更新时间戳。
. Hibernate综合性注解使用案例
表结构
首先,我们定义数据库中的表结构:
CREATE TABLE authors (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR) NOT NULL,
bio TEXT
);
CREATE TABLE books (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR) NOT NULL,
isbn VARCHAR(),
publication_date DATE,
price DECIMAL(, 2),
author_id BIGINT,
FOREIGN KEY (author_id) REFERENCES authors(id)
);
业务案例说明
在这个案例中, Author 实体代表书籍的作者, Book 实体代表书籍。 Author 和 Book 之间存在一对多关系,即一个作者可以有多本书,但每本书只能有一个作者。
- 当创建一个新的作者时, @CreationTimestamp 注解会自动设置其创建时间。
- 当书籍信息更新时, @UpdateTimestamp 注解会自动更新其最后修改时间。
- 书籍的价格使用 @Type 注解来确保在数据库中正确存储和检索。
实体定义
接下来,我们定义Java实体和对应的Hibernate注解。
Author 实体
import javax.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Table(name = authors)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = name, nullable = false)
private String name;
@Column(name = bio)
private String bio;
@OneToMany(mappedBy = author)
private Set<Book> books;
// Getters and setters
}
Book 实体
import javax.persistence.*;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
@Entity
@Table(name = books)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = title, nullable = false)
private String title;
@Column(name = isbn, unique = true)
private String isbn;
@Type(type = org.hibernate.type.DateType)
@Column(name = publication_date)
@CreationTimestamp
private Date publicationDate;
@Column(name = price, precision = , scale = 2)
private BigDecimal price;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = author_id, nullable = false)
private Author author;
// Getters and setters
}
注解说明
- @Entity: 标记类作为JPA实体。
- @Table: 指定实体对应的数据库表名。
- @Id: 标记实体的主键字段。
- @GeneratedValue: 指定主键的生成策略。
- @Column: 指定实体属性与数据库表列的映射。
- @OneToMany: 标记一对多关系。
- @ManyToOne: 标记多对一关系。
- @JoinColumn: 指定关系映射中的外键列。
- @Cache: 指定实体的缓存策略。
- @CreationTimestamp: 自动设置实体的创建时间戳。
- @UpdateTimestamp: 自动设置实体的更新时间戳。
- @Type: 指定自定义的Hibernate类型。