笔记: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:为 longshortint 类型主键生成唯一标识,在集群下不要使用
        • identity:在DB2MySQLMSSQLServerSybase等提供 identity(自增长)主键支持的表中适用,返回的标识属性值是 longshortint类型等
        • sequence:在DB2Oracle等提供Sequence支持的数据表中适用,返回的标识属性值是 longshortint类型的
        • hilo:使用一个高/低位算法高效的生成longshort int 类型的标识符,给定一个表和字段(默认值 hibernate_unique_key 字段 next_hi ) 作为高位值的来源,只在一个特定的数据库中是唯一的
        • seqhilo:使用一个高/低位算法高效的生成longshort int 类型的标识符,需要给定一个数据库的 Sequence名,适用于支持 Sequence的数据库,如 Oracle
        • uuid:用一个128位的UUID算法生成字符串类型的标识符,这个字符串是网络唯一的,UUID编码是一个32位十六进制数的字符串
        • guid:在MSSQLServerMySQL中使用数据库的GUID字符串
        • native:根据底层数据库的能力选择 identitysequence或者 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(该值在insertupdate都会被重新生成);注意:如果设置为 INSERTALWAYS则会在执行insertupdate后,执行一条查询语句,查询数据
    • 标注 @Formulavalue属性可以指定一个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.IDENTITYGenerationType.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不会使用过滤器;

           

           

           

           

         

         

       

       

posted @ 2017-01-30 21:17  立3807  阅读(971)  评论(0编辑  收藏  举报