笔记:Hibernate 持久化类标注说明
- 持久化类标注
- 标注 @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不会使用过滤器;
笔记:Hibernate 持久化类标注说明的更多相关文章
- 笔记:Hibernate 持久化类标注示例-双向1-N关系映射
1-N关系的1端持久化类 package org.drsoft.hibernate.model.oneToMany; import java.util.Date; import java.ut ...
- (转) Hibernate持久化类与主键生成策略
http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...
- Hibernate持久化类属性映射
Hibernate充当应用程序和数据库之间的中间件,实现二者之间的交互操作,他对JDBC进行了封装,以完全面向对象的方式来操作数据. 适用于有多个数据源的情况下,不必去考虑不同数据源的操作差异. Hi ...
- hibernate持久化类中,修改字符串长度时,注意的问题
在使用hibernate注解修饰字符串长度时,如果一开始没有把String类型的变量长度设计好,在网数据库插入数据时,容易造成字段长度超出错误,这时候需要修改@Column里length的大小.如果使 ...
- Hibernate持久化类规则
注意事项: 提供无参的构造方法,因为在hibernate需要使用反射生成类的实例 提供私有属性,并对这些属性提供公共的setting和getting方法,因为在hibernate底层会将查询到的数据进 ...
- (补充)06.Hibernate持久化类&持久化对象
持久化类:就是一个Java类(JavaBean),这个类与表建立映射关系就可以成为是持久类 持久化类 = JavaBean + xxx.hbm.xml 编写规则: 1.提供一个无参数,public访问 ...
- hibernate课程 初探单表映射1-8 hibernate持久化类
java beans 的设计原则 1 公有的类 2 共有不带参数构造方法 3 私有属性 4 属性setter/getter方法 Studnet类: package com.ddwei.student; ...
- 5 -- Hibernate的基本用法 --5 1 持久化类的要求
1. 提供一个无参数的构造器:所有的持久化类都应该提供一个无参数的构造器,这个构造器可以不采用public访问控制符.只要提供了无参数的构造器,Hibernate就可以使用Constructor.n ...
- [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- 实时Web与WebSocket实践
引言:实时Web越来越被重视,Google.Facebook等大公司也逐渐开始提供实时性服务.实时Web将是未来最热门的话题之一. 本文选自<基于MVC的JavaScript Web富应用开发 ...
- vxWorks 命令
1.4.1 任务管理 sp( ) 用缺省参数创建一个任务(priority="100" 返回值为任务ID,或错误)(taskSpawn) sps( ) ...
- R︱shiny实现交互式界面布置与搭建(案例讲解+学习笔记)
要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 看了看往期的博客,这个话题竟然是第 ...
- mongodb命令行group分组和java代码中group分组
group分组统计是数据库比较常用的功能,mongodb也不例外.不过相对于普通的增删改查,group操作就略微麻烦一些, 这里对group在shell中的操作.使用java原生代码操作以及集成spr ...
- md5加密用户登陆遇到的问题及解决办法
有个项目的登陆模块使用到了cas,应需求要求,用户名和密码传输时使用了md5加密模式,加密的密码可以直接保存在数据库,但是加密的用户名则必须解密出来才行,于是后台的java代码中便写了针对用户名的解密 ...
- freemarker报错之十四
1.错误描述 <html> <head> <meta http-equiv="content-type" content="text/htm ...
- Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index
1.错误描述 WARN:2015-05-01 16:45:37[main] - Exception encountered during context initialization - cancel ...
- 解析XML的方法
解析XML的方法 1.DOM生成和解析XML 2.SAX生成和解析XML 3.DOM4J生成和解析XML 4.JDOM生成和解析XML
- Tomcat中的Context.xml的<Loader delegate="true"/>
Tomcat中的Context.xml的<Loader delegate="true"/> 1.<Loader delegate="true" ...
- 摘抄--全面理解面向对象的 JavaScript
全面理解面向对象的 JavaScript JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或 ...