由于网上对Hibernate注解的用法和定义几乎没有,本人在此将常用的常见的一些Hibernate注解进行汇总,本篇不会对所有注解进行详细讲解,比较适用于那些刚接触Hibernate,并且有现成的基于Hibernate的项目的同学来进行字典式查找,帮助同学们快速了解自己的项目。
JPA标准的注解:
@Entity 标注该类是一个实体类,关于实体类的概念,我会在另外一篇文章中进行详细解读,初学者只要认为表示一个数据库的一个表就可以
@Table 常和@Entity一起用,表示数据库中表的名字
@Id 用于标注成员变量,表示该变量是数据库的主键
@GeneratedValue 用于启动该主键的自增策略
@NotNull 用于标注该字段是非空(应用控制,数据库仍然可以可空)
@Basic 如果不希望依赖属性映射默认设置,那么可以将@Basic标注到特定的成员变量
@Column 比@Basic更加常用,也是标注字段的各种属性
@Access 有点类似延迟加载,可以设置该属性在调用get set时候才会查询或提交
@Embeddable 用于标注该类是一个值类,并不是实体类
@Embedded 和Embeddable相对,@Embeddable是标注在类上的,而@Embedded则是标注在属性上的
@AttributeOverride 属性的对应数据库的字段名字重写,有点类似@Column的name属性
@Lob 将JAVA类型映射到数据库的BLOB类型上
@Converter 用于标注到类上,该类必须实现AttributeConverter接口,用于自定义类型转换
@Convert 与@Converter搭配使用,用于启用自定义的类型转换器
@MappedSupperclass 用于标注基类,使基类的属性也被@Entity检测到
@Inheritance 用于实体类的基类,指明各个有兄弟关系的实体类的在数据库中共用方式
@DiscriminatorColumn 用于实体类的基类,如果多个实体类共用一个表的时候,就要用这个标注指定区分实体类的字段是哪一个
@DiscriminatorValue 用于实体类,与@DiscriminatorColumn共用,表示该字段如果是@DiscirminatorValue指定的值,则该记录表示该实体类
@DiscriminatorFormula 用于实体类,如果多个实体类共用一个表,并且区分实体类型的方式较为复杂,就需要用这个标注注明区分各个实体的方法
@ManyToOne 表示实体之间是多对一关系
@OneToMany 表示实体之间是一对多关系
@ManyToMany 表示实体之间是多对多关系
@OneToOne 表示实体之间是一对一的关系
@ElementCollection 当一个实体类的属性中需要用到一个数组表示一段集合时,并且这个集合并不是一个实体类时,需要用到这个注解
@CollectionTable 与@ElementCollection共用,表示该集合所在的表的表名字及其他信息
@OrderColumn @ElementCollection的集合自动按照顺序排列
@MapKeyColumn 如果@CollectionTable中的字段比需要的要多,就用@MapKeyColumn拿出只需要的字段
@JoinColumn 与@ManyToOne共用,标注关联的外键
@OnDelete 标注在@OneToMany旁边,表示当集合中被移除时,同时也删除数据库中的记录
@PrimaryKeyJoinColumn 共享主键策略,用于@OneToOne旁边
@UniqueConstraint 属于@Table中的属性,表示某个字段必须满足唯一性
@Index 属于@Table中的属性,为实体类创建索引
@EmbeddedId 用于标注一个组合主键,与@Embeddable共同使用,其中@Embeddable标注的类必须实现Serializable
@Version 用于表示该字段为乐观锁
@Temporal 表示该属性在数据库中的字段的类型,常用于Date和时间戳的转换
Hibernate提供的注解
@DynamicInsert 标注在实体类,在应用启动时候,禁用INSERT语句生成,加快启动时间
@DynamicUpdate 标注在实体类,在应用启动时候,禁用UPDATE语句生成,加快启动时间
@Immutable 标注在实体类,让实体不可变
@Subselect 标注到实体类,将子查询映射到实体类
@Formula 用于标注实体的派生属性,当调用指定属性的get时候,就调用该标注所用的sql语句
@ColumnTransformer 用于单位自动转换,例如程序使用时用的单位是毫秒,而数据库保存的数据单位为秒时,就可用这个注解自动转换
@ColumnDefault 设置属性默认值
@CreationTimestamp 自动注入实体类的创建时间
@UpdateTimestamp 自动注入实体类被UPDATE的时间
@Enumerated 用于标注该属性为一个枚举属性
@Type 重写Hibernate中默认类型转换
@SortNatural 指定由@ElementCollection标注的集合使用默认排序方法
@SortComparator 指定由@ElementCollection标注的集合的排序方法
@OrderBy 指定由@ElementCollection标注的集合的排序方法
@Parent 指定该实体类的拥有者的引用
@Check Hibernate的字段约束机制,用于表示字段间一定要满足某种关系
@LazyCollection 标明是延迟加载,只有在调用get方法时,才会查询数据库
@Proxy 设置代理的属性,通常用于禁用代理,也就是调用em.getReference的时候,返回的就是实体对象
@BatchSize 用于批量查询的时候,提前获取@BatchSize标注的数量,减少查询次数
@Fetch 用于标注属性,通常与@OneToMany和@ManyToOne一起用,表示使用特定方式进行级联查询
@Cascade 用于设置属性的级联等级
@PostPersist 类似Spring的面向切面机制,标注一个方法,这个方法在实体被persist的时候调用,常用于记录数据库日志等信息。类似的还有@PostLoad,@PrePersist,@PreUpdate,@PostUpdate, @PreRemove,@PostRemove
@Audited 启用审计日志,启用之后,可以用AuditReader查看该实体类的修改记录
@Filter 按照该注解的condition属性,自动过滤记录,如果该记录需要通过过滤器,必须最后的结果为true