-
持久化类标注
- 标注 @Entity:注解声明该类是一个Hibernate的持久化类
-
标注 @Table:指定该类映射的表
- 参数 name:指定映射数据库表的名称
- 参数 uniqueConstraints:为持久化类所映射的表设置唯一约束,该属性的值是 @UniqueConstraint 标注数组
- 参数 indexes:为持久化类说映射的表设置索引,该属性的值是 @Index 标注数组
- 参数 catalog:设置持久化类说映射的表放入指定的 catalog 中,没有指定则放入默认 catalog
- 参数 schema:设置持久化类说映射的表放入指定的 schema 中,没有指定则放入默认 schema
-
标注 @UniqueConstraint:用于为数据表定义唯一索引
- 参数 columnNames:该属性的值是一个字符串数组,列的名称
-
标注 @Index:用于为数据表定义索引
- 参数 columnList:设置哪些列为索引,可以指定多个数据列的列名
- 参数 name:设置该索引的名称
- 参数 unique:设置该索引是否具有唯一性,该值为 bool 类型
-
主键及生成策略标注
-
标注 @Id:用于指定该类的标识属性,唯一标识该对象的属性,通常映射到数据库表的主键列,如果只设置了此标注,没有@GeneratedValue标注,则使用@GeneratedValue标注的默认值,如果多个字段设置了@Id标注,则持久类需要满足如下条件:
- 有无参数的构造函数
- 实现 java.io.Serializable 接口
- 根据多个主键列所映射的属性来重写 euals()和hashCode()方法
-
标注 @GeneratedValue:用于指定主键的生成策略
-
参数 strategy:指定主键的生成策略,有如下策略:
- 枚举 IDENTITY:主键由数据库自动生成(主要是自动增长型)
- 枚举 AUTO:主键由程序控制(默认)
- 枚举 SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列,并且还需要使用 @SequenceGenerator 标注
- 枚举 TABLE:使用一个特定的数据库表格来保存主键,如果配置这个枚举,则还需要使用@TableGenerator 标注来标识使用那个表
- 参数 generator:用于指定策略的名称,比如 SEQUENCE\TABLE 需要额外标注,此处设置标注的名称
-
-
标注@TableGenerator:用于指定表主键生成策略
- 参数 name:主键生成策略名称
- 参数 table:生成策略所持久化的表名
- 参数 catalog:指定表存在的目录,默认值 ""
- 参数 schema:指定表存在的数据库,默认值""
- 参数 pkColumnName:表的主键列名称
- 参数 pkColumnValue:表的主键值
- 参数 valueColumnName:该主键策略生成主键值的列名称
- 参数 initialValue:主键初识值,默认值 0
- 参数 allocationSize:表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认值 50
-
标注 @SequenceGenerator:用于指定序列生成策略
- 参数 name:主键生成策略名称
- 参数 sequenceName:生成策略用到的数据库序列名称
- 参数 initialValue:主键初识值,默认值 0
- 参数 allocationSize:表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认值 50,将其定义为 Sequence 时 increment by 的值
- 参数 catalog:指定表存在的目录,默认值 ""
- 参数 schema:指定表存在的数据库,默认值""
-
标注 @GenericGenerator:定义主键生成器
- 参数 name:设置主键生成器的名称,改名称可以被 @GeneratorValue 的 generator 属性引用
-
参数 strategy:设置该主键生成器的主键生成策略
- 值 increment:为 long、short、int 类型主键生成唯一标识,在集群下不要使用
- 值 identity:在DB2、MySQL、MSSQLServer、Sybase等提供 identity(自增长)主键支持的表中适用,返回的标识属性值是 long、short、int类型等
- 值 sequence:在DB2、Oracle等提供Sequence支持的数据表中适用,返回的标识属性值是 long、short、int类型的
- 值 hilo:使用一个高/低位算法高效的生成long、short和 int 类型的标识符,给定一个表和字段(默认值
表 hibernate_unique_key 字段 next_hi ) 作为高位值的来源,只在一个特定的数据库中是唯一的 - 值 seqhilo:使用一个高/低位算法高效的生成long、short和 int 类型的标识符,需要给定一个数据库的 Sequence名,适用于支持 Sequence的数据库,如 Oracle
- 值 uuid:用一个128位的UUID算法生成字符串类型的标识符,这个字符串是网络唯一的,UUID编码是一个32位十六进制数的字符串
- 值 guid:在MSSQLServer和MySQL中使用数据库的GUID字符串
- 值 native:根据底层数据库的能力选择 identity、sequence或者 hilo中的一个
- 值 assigned:让应用程序在save() 之前位对象分配一个标识符,这相当于不指定主键生成策略所采用的默认策略
- 值 select:通过数据库触发器选择某个唯一主键的行,并返回其主键值作为唯一标识属性
- 值 foreign:表明直接使用另一个关联对象的标识属性值,适用于 1-1关联映射中采用
-
-
数据更新标注
- 标注 @DynamicInsert:用于指定插入记录的 insert 语句是否在运行时动态生成,并且只插入哪些非空字段,默认值 false
- 标注 @DynamicUpdate:用于指定更新记录的update语句是否运行时动态生成,并且只更新改变过的字段,默认值 false
- 标注 @SelectBeforeUpdate:指定在update某个持久化对象前,是否需要先查询,如果查询到持久化对象状态被修改过,才会使用update保存其状态,默认值 false
- 标注 @Transient:指定属性不持久化,不会保存到数据库
-
标注 @Enumerated:指定字段是枚举类型
- 参数 EnumType.ORDINAL:表示数据库存储枚举的数值序号来表示
- 参数 EnumType.STRING:表示数据库存储枚举的字符串来表示
- 标注 @Lob:将属性映射为大数据类型,byte[]、Byte[]或者java.io.Serializable类型时,映射底层数据库的Blob列;当持久化类的属性为 char[]、Character[]或者java.lang.String 类型时,映射底层数据库的Clob列
-
标注 @Temporal:修饰日期类型的属性
- 参数 TemporalType.DATE:数据库映射的 date 类型,将不会保存时间数据
- 参数 TemporalType.TIME:数据库映射的 time 类型
- 参数 TemporalType.TIMESTAMP:数据库映射的 timestamp 类型
- 注意:如果数据库时 DateTime 类型,则不需要用该标注
-
查询标注
- 标注 @Where:可以指定一个附加的SQL语句过滤条件,不管采用 load()、get()还是其他查询方法,只要试图加载持久化对象时,改where条件就会生效
-
标注 @Column:用于配置列信息
- 参数 name:映射数据库的列名称
- 参数 unique:列是否唯一,默认值 false
- 参数 nullable:列是否可以为 null,默认值 true
- 参数 insertable:设置插入数据库时,是否包含该列,默认值 true
- 参数 updatable:设置更新数据库时,是否包含该列,默认值 true
- 参数 length:设置列的长度
- 参数 columnDefinition:该属性的值是一个代表列定义的SQL字符串(列名后面部分),指定创建该数据列的SQL
- 参数 precision:在使用decimal类型时,用于表示数据有效位数,默认值 0
- 参数 scale:在使用decimal类型时,表示数字小数点右边的位数,默认值 0
- 参数 table:指定该列所属的表名称,当需要用多个表来保存一个实体时,需要指定这个属性
- 标注 @Generated:设置该属性映射的数据列的值是否由数据库生成,该值可以接收GeneratedTime.NEVER(不由数据库生成)、GeneratedTime.INSERT(数据库在执行insert时生成,但不会在执行 update 语句时重新生成和GeneratedTime.ALWAYS(该值在insert和update都会被重新生成);注意:如果设置为 INSERT和ALWAYS则会在执行insert和update后,执行一条查询语句,查询数据
- 标注 @Formula:value属性可以指定一个SQL表达式,指定该属性的值是根据表达式来计算得出的,无需保存到数据库;注意:格式为 value="(sql)"的英文括号不能少,表达式中的列名和表名于数据库对应
-
标注 @Basic:表示属性延迟加载
- 参数 fetch:指定是否延迟加载属性,FetchType.EAGER 不延迟加载,立即加载;FetchType.LAZY 延迟加载。注意:Hibernate 4.3 版本不生效
- 参数 optional:指定该属性映射的数据列是否允许使用null值
-
映射集合标注
-
标注 @ElementCollection:映射集合
- 参数 fetch:指定实体对集合的抓取策略,FetchType.EAGER 不延迟加载,立即加载;FetchType.LAZY 延迟加载(默认)
- 参数 targetClass:指定集合的属性中集合元素的类型,比如 String.class
-
标注 @CollectionTable:映射保存集合的属性表
- 参数 name:指定保存集合属性的表名称
- 参数 indexes:为持久化类所映射的表设置索引,该属性是 @Index 注解数组
- 参数 joinColumns:为持久化类型映射一个外键列,该属性是@JoinColumn 注解数组
- 参数 uniqueConstraints:为持久化类所映射的表设置唯一约束,该属性的值是 @UniqueConstraint 标注数组
- 参数 catalog:设置持久化类说映射的表放入指定的 catalog 中,没有指定则放入默认 catalog
- 参数 schema:设置持久化类说映射的表放入指定的 schema 中,没有指定则放入默认 schema
- 标注 @JoinColumns:用于映射复合外键列,该标注是 @JoinColumn 标注的数组
-
标注 @JoinColumn:用于映射外键列
- 参数 name:设置外键的列名称
- 参数 table:设置外键列所属表名称
- 参数 unique:列是否唯一,默认值 false
- 参数 nullable:列是否可以为 null,默认值 true
- 参数 insertable:设置插入数据库时,是否包含该列,默认值 true
- 参数 updatable:设置更新数据库时,是否包含该列,默认值 true
- 参数 columnDefinition:该属性的值是一个代表列定义的SQL字符串(列名后面部分),指定创建该数据列的SQL
- 参数 referencedColumnName:指定该列所参照表的主键列的列名
- 标注 @BatchSize:当抓取集合属性或者延迟加载的实体时,指定每批次抓取的实例数量
-
标注 @OrderColumn:用于指定List集合、数组的索引列
- 参数参照 @Column 标注
-
标注 @MapKeyColumn:用于映射Map集合的索引列(Key)
- 参数参照 @Column 标注
-
标注 @MapKeyClass:用于指定映射Map集合的索引列类型
- 参数 value:用于指定Map 的Key类型,示例 String.class
- 标注 @SortNatural:表示对集合元素采用自然排序
-
标注 @SortComparator:表示对集合元素采用定制排序
- 参数 value:该属性为 Comparator 实现类
- 标注 @OrderBy:使用SQL查询的OrderBy来实现排序
-
-
映射组件属性
- 标注 @Enbeddable:表示类作为持久化类的组件使用
-
标注 @Parent:用来标注使用组件的父类,示例如下:
@Embeddable
public class HibernateDevEModel {
@Parent
private [父类] owner;
}
- 标注 @EmbeddedId:用于表示持久化类的的复合组件主键,,复合组件类则不需要做额外处理
-
关联映射
-
标注 @ManyToOne:对于单向N-1关系,该标注需要在N的一端使用,并使用@JoinColumn标注来映射外键列
- 参数 cascade:指定对关联实体采用怎么样的级联策略,CascadeType.ALL 指定所用操作都级联到关联实体;CascadeType.MERGE 指定将 merge 操作级联到关联实体;CascadeType.PERSIST 指定将 persist 操作级联到关联实体;CascadeType.REFRESH 指定将 refresh 操作级联到关联实体;CascadeType.REMOVE 指定将 remove 操作级联到关联实体
- 参数 fetch:指定抓取策略,FetchType.EAGER 抓取实体时立即抓取;FetchType.LAZY 延迟抓取关联实体
- 参数 optional:指定关联关系是否可选
- 参数 targetEntity:指定关联实体的类名
-
标注 @JoinTable:使用关联表来映射关系
- 参数 name:关联表名称
- 参数 catalog:指定表存在的目录,默认值 ""
- 参数 schema:指定表存在的数据库,默认值""
- 参数 joinColumns:配置当前表中的外键信息,该属性是 @JoinColumn 注解数组
- 参数 inverseJoinColumns:配置对应表的外键信息,该属性是 @JoinColumn 注解数组
- 参数 targetEntity:指定关联实体的类名
- 参数 indexes:为连接表设置索引,该属性是 @Index 注解数组
- 参数 uniqueConstraints:为持久化类所映射的表设置唯一约束,该属性的值是 @UniqueConstraint 标注数组
-
标注 @OneToOne:用于标记1-1的关联关系,需要在持久化类里增加代表关联实体的成员变量,并为成员变量增加 setter 和 getter 方法。
- 参数 cascade:指定对关联实体采用怎么样的级联策略,CascadeType.ALL 指定所用操作都级联到关联实体;CascadeType.MERGE 指定将 merge 操作级联到关联实体;CascadeType.PERSIST 指定将 persist 操作级联到关联实体;CascadeType.REFRESH 指定将 refresh 操作级联到关联实体;CascadeType.REMOVE 指定将 remove 操作级联到关联实体
- 参数 mappedBy:该属性合法的属性值为关联实体的属性名(不是表字段,而是实体的关联实体属性名称),该属性指定关联实体中那个属性可引用到当前实体,使用该属性后,将不能使用 @JoinColumn 和 @JoinTable 来标记关系
- 参数 fetch:指定抓取策略,FetchType.EAGER 抓取实体时立即抓取;FetchType.LAZY 延迟抓取关联实体
- 参数 orphanRemoval:该属性设置是否删除"孤儿"实体
- 参数 optional:指定关联关系是否可选
- 参数 targetEntity:指定关联实体的类名
-
标注 @OneToMany:用于标记1-N的关联关系,需要在持久化类里增加代码关联实体的集合成员变量,并未集合成员变量增加setter 和getter 方法
- 参数 cascade:指定对关联实体采用怎么样的级联策略,CascadeType.ALL 指定所用操作都级联到关联实体;CascadeType.MERGE 指定将 merge 操作级联到关联实体;CascadeType.PERSIST 指定将 persist 操作级联到关联实体;CascadeType.REFRESH 指定将 refresh 操作级联到关联实体;CascadeType.REMOVE 指定将 remove 操作级联到关联实体
- 参数 mappedBy:该属性合法的属性值为关联实体的属性名(不是表字段,而是实体的关联实体属性名称),该属性指定关联实体中那个属性可引用到当前实体,使用该属性后,将不能使用 @JoinColumn 和 @JoinTable 来标记关系
- 参数 fetch:指定抓取策略,FetchType.EAGER 抓取实体时立即抓取;FetchType.LAZY 延迟抓取关联实体
- 参数 targetEntity:指定关联实体的类名
- 参数 orphanRemoval:该属性设置是否删除"孤儿"实体
-
-
继承标注(整个类层次对应一个表的映射策略)
- 标注 @Inheritance:用于指定继承映射的策略,需要指定值为 InheritanceType.SINGLE_TABLE 整个类层次对应一个表
-
标注 @DiscriminatorColumn:配置辨别者列,主要用于继承关系的顶层基类
- 参数 name:指定辨别者列的名称
- 参数 discriminatorType:辨别者列的数据类型,DiscriminatorType.CHAR 辨别者列的类型是字符类型;DiscriminatorType.INTEGER 辨别者列的数据类型是整数类型;DiscriminatorType.STRING 辨别者列的数据类型是字符串类型
- 参数 length:该属性指定辨别者类型列的字符长度
- 参数 columnDefinition:该属性的值是一个代表列定义的SQL字符串(列名后面部分),指定创建该数据列的SQL
-
标注 @DiscriminatorValue:配置辨别者列的值,主要用于子类
- 参数 value:指定辨别者列的值
-
继承标注(连接子类的映射策略)
- 标注 @Inheritance:用于指定继承映射的策略,需要指定值为 InheritanceType.JOINED 连接子类的映射策略,这种策略下,父类实体的数据保存到父表,子类实体增加的属性数据保存到子表中,这种策略下只需要在继承关系的顶层基类配置该标注即可
-
继承标注(每个具体类对应一个表的映射策略)
- 标注@Inheritance:用于指定继承映射的策略,需要指定值为 InheritanceType.TABLE_PRE_CLASS 连接子类的映射策略,这种策略下,支持每个具体的类对应一个表的映射策略,在这种策略下,子类增加的属性也可以有非空约束,父类的实例的数据保存在父表中,子类实例的数据保存到子表中,这种策略下只需要在继承关系的顶层基类配置该标注即可。注意:这种情况下的主键不能使用 GeneratioTYpe.IDENTITY、GenerationType.AUTO这二种主键策略
-
命名查询
-
标注 @NamedQuery:配置命名查询,定义命名查询可以通过Session提供的 getNamedQuery 方法来创建一个 Query 对象,如果一个持久化类右多个命名查询,可以使用 @NamedQueries 来组合多个 @NamedQuery 标注
- 参数 name:该属性指定命名查询的名称
- 参数 query:该属性指定命名查询所使用的HQL查询语句
建议该标注在hbm配置文件中增加,示例如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-1-15 14:17:45 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="类完整名称" table="表名称">
……其他属性
<query name="命名查询名称">
HQL查询表达式
</query>
</class>
</hibernate-mapping>
-
-
数据过滤
-
标注 @FilterDef 定义数据过滤器,如果需要配置多个 @FilterDef 可以使用 @FilterDefs 标注,参数为 @FilterDef 数组,过滤器可以带参数,并且可以在可以在运行时决定是否启用指定的过滤器及参数,过滤器使用分成三步:
- 定义过滤器,使用Hibernate提供的@FilterDef定义过滤器。
- 使用过滤器,使用@Filter标注应用过滤器
- 在代码中通过 Session启用过滤器,并赋值参数
- 完成后通过Session关闭过滤器
-
标注 @FilterDef 的参数
- 参数 name:该属性用于指定过滤器的名称
- 参数 defaultCondition:该属性定义带参数的 SQL 条件表达式
- 参数 parameters:该属性指定过滤器中SQL条件表达式的参数,值为 @ParamDef 标注的数组
-
标注 @ParamDef:用于定义过滤器的参数
- 参数 name:该属性用于指定过滤器参数的名称
- 参数 type:该过滤器参数的类型(java类型)
-
标注 @Filter:用于应用过滤器
- 参数 name:定义的 @FilterDef 的名称
- 参数 condition:定义的数据过滤条件,如果定义了则会替换定义 @FilterDef 中的 defaultCondition条件,如果没有定义,则默认为
定义 @FilterDef 中的 defaultCondition条件
-
注意:
-
使用session.load()或者session.get()按照主键查询是不会使用过滤器的;使用SQLQuery不会使用过滤器;
-
-
相关文章
- 12-14孙卫琴的《精通JPA与Hibernate》的读书笔记:持久化层对象的四种状态
- 12-14hibernate 为什么持久化类时必须提供一个不带参数的默认构造函数
- 12-14笔记:Hibernate 持久化类标注示例-双向1-N关系映射
- 12-14mybatis与hibernate常用的持久化类,及sqlsession和sqlsessionTemplate区别
- 12-14(转) Hibernate持久化类与主键生成策略
- 12-14java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询
- 12-14Hibernate中的持久化类
- 12-14Hibernate学习——持久化类的学习
- 12-14[原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
- 12-14笔记:Hibernate 持久化类标注说明