hibernate注解映射属性

https://blog.csdn.net/dada678/article/details/51786201

1、普通属性

@Entity:修饰的持久化类的所有属性都会被映射到底层数据库。

@Column:修饰属性

@Transient:修饰不想持久化保存的属性。

@Lob:修饰大数据属性。

当属性为byte[]、Byte[]时数据库对应Blob

当属性为char[]、character[]、String时,对应为Clob.

@Temporal修饰日期类型

支持TemporalType.DATE、TemporalType.TIME、TemporalType.TIMESTAMP

@GenericGenerator注解主键生成器  name strategy

例如:

@GenericGenerator(name="fk_hilo",strategy="hilo" )    //指定主键生成策略为hilo

@GeneratedValue(generator="fk_hilo")     //使用该主键生成策略

2、映射集合属性

集合分为两种类型:一、List、Set、数组

二、Map

hibernate要求持久化集合值字段必须声明为接口。

不论哪种集合,统一使用@ElementCollection注释

属性fetch指定抓取策略   targetClass:指定集合类型。

外键列@JoinColumn

当集合元素为基础数据类型时,用@Column注释定义集合元素即可

@OrderColumn可以定义List集合、数组的索引列

@MapKeyColumn用于映射Map集合的索引列

例如:数组、list集合可以这样写

@ElementCollection(targetClass=String.class)   //集合属性保存对象关联关系

@CollectionTable(name="school_inf",joinColumns=@joinColumn(name="person_id",nullable=false))  //映射保存集合属性的表

@Column(name="school_name")    //指定保存集合元素的列为school_name

@OrderColumn(name="array_order")   //映射集合的索引列

private String[] schools;

例如:set集合,set集合无序,所以不用写OrderColumn

<list name="school_name" table="school_inf">

<key>

<column name="person_id" not-null="true"/>

</key>

<list-index>

<column name="array_order"/>

<list-index>

<element type="String" column="school_name"></element>

</list>

例如:

@ElementCollection(targetClass=String.class)   //集合属性保存对象关联关系

@CollectionTable(name="school_inf",joinColumns=@joinColumn(name="person_id",nullable=false))  //映射保存集合属性的表,nullable=false说明该列为非空。

@Column(name="school_name")    //指定保存集合元素的列为school_name

private Set<String> schools;

   <set name="school_name" table="school_inf" >
            <key>
                <column name="person_id"  not-null="true" />
            </key>
            <element type="string" column="school_name"></element>
        </set>


例如:


@ElementCollection(targetClass=Float.class)   //集合属性保存对象关联关系

@CollectionTable(name="score_inf",joinColumns=@joinColumn(name="person_id",nullable=false))  //映射保存集合属性的表,nullable=false说明该列为非空。

@MapKeyColumn(name="subject_name") //指定Map Key

@Column(name="mark")    //指定保存集合元素的列为school_name

3、集合属性性能分析

在初始化持久化实体时,立即抓取所有的集合属性,将导致性能急剧下降,对于集合属性,通常使用延时加载策略。

@ElementCollection(fetch=FetchType.EAGER)

无序集合只能遍历,性能差

虽然数组也是有序结合,但是数据无法使用延时加载(因为数组长度不可变),所以实际上用数组作为集合性能并不高,通常认为List、Map集合性能较高,而

Set紧随其后

提高性能的策略:

对于删除集合中的元素,保留部分元素的情况,应该先清空集合,再插入保留元素。

List<String> tmp=person.getSchools();

person.setSchools(null);  //清空操作

person.setSchools(tmp);

 4、有序集合映射

     如果希望数据库查询自己对集合元素排序,可以利用Hibernate自己提供的@OrderBy注解

@OrderBy("traing_name desc");

5、映射数据库对象

如果希望在映射文件中创建和删除触发器,存储过程等数据库对象,hibernate提供了<database-object/>元素来满足这种需求

<database-object>

<create>create table test(t_name varchar(255))</create>

<!--指定仅对特定方言有效-->

<dialect-scope name="org........"/>

</database-object>

   这样在创建sessionFactory对象时,上面代码就生效了,数据库中就新建了test表。

Hibernate提供了schemaExport工具,生成数据库对象。

Configuration conf=new Configuration().configure();

SchemaExport se=new SchemaExport(conf);

se.setFormat(true)   //格式化sql

  .setOutputFile("news.sql")    //设置保存sql脚本的文件

.create(true,true);  //输入sql脚本并执行

6、映射组件属性:

持久化类属性并不是基础数据类型,例如privte Name name;

一、可以用@Embeddable注释Name类,作为组件使用,用@Parent修饰该属性。(修饰Name里的 private Person owner)

二、直接在Person实体类中,包含一个组件类型(Name类)

@Embedded

@AttributeOverrides({

@AttributeOverride(name="first",column=@Column(name="person_firstname")),

@AttributeOverride(name="last",column=@Column(name="person_lastname")),

})
---------------------

原文:https://blog.csdn.net/dada678/article/details/51786201
版权声明:本文为博主原创文章,转载请附上博文链接!

Hibernate提供了如下三种方式将POJO变成PO类。

1使用持久化注解(以JPA标准注解为主,如果有一些特殊要求,则依然需要使用 Hibernate本身提供的注解

种方式可以

2使用JPA2提供的XML配置描述文件(XML deployment descriptor),使用这种方式可以让Hibernate的PO类与JPA实体类兼容。

3使用 Hibernate传统的XML映射文件(* hbm. xml文件的形式),由于这种方式是传统 Hibernate

对于 Hibernate PO类而言,通常可以采用如下两个注解来修饰它。

@ Entity:被该注解修饰的POJO就是一个实体。使用该注解时可指定一个name属性,name属性指定该实体类的名称,但大部分时候无须指定该属性,因为系统默认以该类的类名作为实体类的名称

@ Table::该注解指定持久化类所映射的表。

使用Table注解可指定如表52所示的属性

属性

是否必须

说明

catalog

设置将持久化类映射的表放入指定的 catalog中,如果没有指定该属性,数据表将放入默认的 catalog中

indexes

为持久化类所映射的表设置索引。该属性的值是一个@Index注解数组

name

设置持久化类所映射的表的表名。如果没有指定该属性,那么该表的表名将与持

久化类的类名相同

schema

设置将持久化类所映射的表放入指定的 schema中。如果没有指定该属性,数据表将放入默认的schema中

uniqueConstraints

为持久化类所映射的表设置唯一约束。该属性的值是一个@ UniqueConstraint注解数组

@UniqueConstraint用于为数据表定义唯一约束。它的用法非常简单,使用该注解时可以指定如下唯一的属性

columnNames

该属性的值是一个字符串数组,每个字符串元素代表一个数据列

@Index用于为数据表定义索引。该注解可指定如表53所示的属性。

属性

是否必须

说明

columnList

设置对哪些列建立索引,该属性的值可指定多个数据列的列名

name

置该索引的名字

unique

设置该索引是否具有唯一性。该属性的值只能是 boolean值

如果希望改变 Hibernate的属性访问策略,则可使用标准的@ Access注解修改该持久化类,该注解的value属性支持 AccessType.PROPERTY和 Access.TypeFIELD两个值。其默认值为 AccessType PROPERTY,

即使用 getter/setter法访问属性两个方法

如果将@Acess注解的value指定为 AccessType FIELD, Hibernate将直接通过成员变量来访问属性。

除此之外, Hibernate还为持久化类提供了如下特殊的注解。

@ Proxy:该注解的 proxyClass属性指定一个接口,在延迟加载时作为代理使用,也可以在这里

指定该类自己的名字

@ DynamicInsert:指定用于插入记录的 Insert语句是否在运行时动态生成,并且只插入那些非空字段。该属性的值默认是 false。开启该属性将导致 Hibernate需要更多时间来生成SQL语句。

@ DynamicUpdate:指定用于更新记录的 update语句是否在运行时动态生成,并且只更新那些改变过的字段。该属性的值默认是 false。开启该属性将导致 Hibernate需要更多的时间来生成SOL语句

提示

程序打开了@ DynamicUpdate之后,持久化注解可以指定如下几种乐观锁定的策略

  1. OptimisticLockType.VERSION:检查 version/timestamp字段
  2. OptimisticLockType.ALL:检查全部字段
  3. OptimisticLockType.DIRTY:只检查修改过的字段
  4. OptimisticLockType.NONE:不使用乐观锁定

强烈建议在 Hibernate中使用 version/timestamp字段来进行乐观锁定。对性能来说,这是最妤的选择,并且也是唯一能够处理在 Session外进行脱管操作的策略。

@SelectBeforeUpdate:指定 Hibernate在更新( update)某个持久对象之前是否需要先进行一次查询(select)。如果将该注解的 value值设为ture,则 Hibernat可以保证只有当持久化对象的状态被修改过时,才会使用 update语句来保存其状态(即使程序显式使用 save OrUpdateO来保存该对象,但如果 Hibernate查询到对应记录与该持久化对象的状态相同,也不会使用update语句来保存其状态)。该注解的 value值默认为 false。通常来说,将@SelectBeforeUpdate的 value值设为ture会降低性能,如果应用程序中,某个持久化对象的状态经常会发生改变,那么该属性应该设置为 false;如果该持久化对象的状态很少发生改变,而程序又经常要保存该对象,则可将该属性设置为ture

@PolymorphismType:当采用 TABLE_PER_CLASS继承映射策略时,该注解用于指定是否需要采用隐式多态查询。该注解的 value的默认值为 PolymorphismType.IMPLICIT,即支持隐式多态查询

将@PolymorphismType的vaue值设为 PolymorphismType.IMPLICIT时,如果查询时给出的是任何超类、该类实现的接口或该类的名字,那么都会返回该类(及其子类)的实例;如果查询中给出的是子类的名字,则只返回子类的实例;否则,只有在查询时明确给出某个类名时,才会返回这个类的实例。大部分时候都需要使用隐式多态查询

@ Where:该注解的 clause属性可指定一个附加的SQL语句过滤条件(类似于添加 where子句),如果一旦指定了该注解,则不管采用load()、get()还是其他查询方法,只要试图加载该持久化类对象时,该 where条件就会生效。也就是说,只有符合该where条件的记录才会被加载。

@ BatchSize:当 Hibernate抓取集合属性或延迟加载的实体时,该注解的size属性指定每批抓取的实例数。

@OptimisticLocking该注解的type属性指定乐观锁定策略。 Hibernate支持OptimisticLockType.ALL、OptimisticLockType.DIRTY、 OptimisticLockType.NONE、 OptimisticLocklype.VERSION这4个枚举值默认值为 OptimisticLockType.VERSION

@ Check:该注解可通过 constraints指定一个SQL表达式,用于为该持久化类所对应的表指定一个 Check约束。

@ Subselect::该注解用于映射不可变的、只读实体。通俗地说,就是将数据库的子查询映射成Hibernate持久化对象。当需要使用视图(其实质就是一个查询)来代替数据表时,该注解比较有用

在默认情况下,被@Entity修饰的持久化类的所有属性都会被映射到底层数据表,为了指定某个属性映射的数据列的详细信息,如列名、列字段长度等,可以在实体类中使用@Column修饰该属性

使用@ Column时可指定如表所示的常用属性

属性

是否必须

说明

columnDefinition

属性的值是一个代表列定义的SQL字符串(列名后面部分),指定创建该数据列的SQL语句

insertable

指定该列是否包含在围生成的insert语句列表中,默认值true

length

指定列所能保存的数据的最大长度,默认值:255

name

指定该列的列名,该到的列名默认与Coum修饰的成员变量名相同

nullable

指定该列是否允许为null.默认值:true

precision

当该列是 decimal类型时,该属性指定该列最大支持的最大有效数字位

scale

当该列是 decimal类型时,该属性指定该列最大支持的小数位数

table

指定该列所属的表名,当需要用多个表来保存一个实体时,需要指定

unique

指定列是否具有准一的束,默认值为false,即不具有唯一约束

updatable

指定该列是否包含在 Hibemate生成的update语句的列到表中,默认值true

Hiberate同样允许使用 @Access注解修饰该属性,用于单独改变 Hibemate对该属性的访问策略@Access用于覆盖在持久化类上指定的 @Access注解除此之外, Hibemate还为属性映射提供了如下特殊的注解

@Formula该注解的value属性可指定一个SQL表达式,指定该属性的值将根据表达式来计算,持久化类对应的表中没有和计算属性对应的数据列----因为该属性值是动态计算出来的,无需保存到数据库

@Generated设置该属性映射的数据列的值是否由数据库生成,该注解的 value属性可以接受GerationTime.NEVER(不由数据库生成)、 GenerationTime.INSERT(该属性值在执行insert句时生成,但不会在执行update语句时重新生成)和 Generationtime.ALWAYS该属性值在执行insert和update语句时都会重新生成)这三不值的其中之一。

@Formula的 value属性允许对象属性包含表达式,包括运用sum、 average,mux函数求值的结果

va1ue=”(select avg(p.price) from Product p)”

@Formula甚至可以根据另外一个表的查询结果来计算当前记录的属性值,例如,下面代码把currency表查询的结果作为当前记录的计算属性值

Value="(select cus.same from currency cur where cur.id=curreneyID)">

使用 @Formula注解时有如下几个注意点

  1. value="(sql)"的英文括号不能少
  2. value="(sql)"的括号里面是SOL表达式,SQL表达式中的列名与表名都应该和数据库对应,而不是和持久化对象的属性对应
  3. 如果需要在@Formula的value属性中使用参数,则直接使用 where cur.id= currencyID形式,其中 currencyID就是参数,当前持久化对象的 curreneyID属性将作为参数传入

import javax.persistence.Basic;

import javax.persistence.Column;

import javax.persistence.EnumType;

import javax.persistence.Enumerated;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Lob;

import javax.persistence.Temporal;

import javax.persistence.TemporalType;

import javax.persistence.Transient;

import javax.swing.JList.DropLocation;

 

import org.hibernate.annotations.Formula;

import org.hibernate.annotations.Generated;

import org.hibernate.annotations.GenerationTime;

 

public class News implements Serializable {

   public enum SeasonTime

   {

     springTime,summer,fall,winter

   }

   //使用@Enumerate修饰枚举

   @Enumerated(EnumType.ORDINAL)

   @Column(name="happen_season",length=50)//指定数据列表名称和长度   底层会保存数据序号来保存枚举值

   private SeasonTime happenSeason;

   /***

    * 使用@Lob、@Basic修饰大数据类型的属性

    * 用于数据库保存图片、保存大段文章的场景,数据库通常采用Blob、Clob类型的数据列来保存他们;

    * JDBC则采用java.sql.Blob、java.sql、Clob表示大数据类型

    * Hibernate使用@Lob来修饰这种大数据类型

    * 1.当持久化类的属性为byte[]、Byte[]或java.io.Serializable类型修饰的属性将映射为底层的Blob列

    * 2.当持久化类的属性为char[]、Character[]或java.lang.Strign类型时,@Lob修饰的属性将映射为底层的Clob

    * 使用@Basic指定延迟加载,可以指定如下属性

    * 1)fetch:指定是否延迟加载该属性。

    * FetchType.EAGER立即加载、FetchType.LAZY延迟加载

    * 2)optional:指定该属性映射的数据列是否允许使用null值

    * **/

   @Lob

   @Basic(fetch=FetchType.LAZY)

   private byte[] pic;

   /***

    * @GeneratedValue支持的属性

    * strategy 否  指Hibernate对该主键使用怎样的主键生成策略。该属性使用如下4个属性值

    * 1)GenerationType.AUTO:Hibernate自动选择最适合底层数据库的主键生成策略。这是默认值

    * 2)GenerationType.IDENTITY:对于MySQL、SQL Server这样的数据库,选择自增长这样的主键生成策略

    * 3)GenerationType.SEQUENCE:对于Oracle数据库,选择使用基于Sequence的主键生成策略。

    * 与@SequenceGennerator一起使用

    * 4)GenerationType.TABLE:使用辅助表来生成主键。与@TableGenerator一起使用

    * generator 否 当使用GeneatonType.SEQUENCE、GenerationType.TABLE主键生成策略时,

    * 该属性引用@SequenceGenerator、@TableGenerator所定义的生成器的名称

    * **/

   @Id

   @GeneratedValue(strategy=GenerationType.IDENTITY)

   private Integer id;

   private String title;

   private String autohor;

   /***

    * 使用@Temporal修饰日期类型的属性

    * java.util.Date既包括日期部分,也包括时间部分;使用@Temporal(TemporalType.DATE)将该属性映射到date类型的数据列

    * **/

   @Temporal(TemporalType.DATE)

   private Date date;

   //指定@Generated的value为ALWAYS,表明该属性的值由数据库生成

   //Hibernate会在每次执行insert、update时执行select语句来查询获取该属性的值

   //使用此属性需要数据库触发器支持

   /**

    * drop database hibernate;

create database hibernate;

use hibernate;

create table news

(

id int auto_increment primary key,

title varchar(255) not null,

content varchar(255),

full_content varchar(2555)

);

DELIMITER |

create trigger t_full_content_gen BEFORE INSERT ON  news

   FOR EACH ROW BEGIN

     set new.full_content=concat(new.title,new.content);

   END;

|

DELIMITTER;  

 

    * **/

  

   @Generated(GenerationTime.ALWAYS)

   private String generContent;

   //此属性由系统根据公式生成

   @Formula("(select concat(nt.title,nt.autohor)"+"from NEWS nt where nt.id = id)")

   private String fullConent;

   //使用@Transient修饰不想持久保存的属性

   @Transient

   public Integer getId() {

     return id;

   }

   public void setId(Integer id) {

     this.id = id;

   }

   public String getTitle() {

     return title;

   }

   public void setTitle(String title) {

     this.title = title;

   }

   public String getAutohor() {

     return autohor;

   }

   public void setAutohor(String autohor) {

     this.autohor = autohor;

   }

   public Date getDate() {

     return date;

   }

   public void setDate(Date date) {

     this.date = date;

   }

   public News() {

//   super();

     // TODO Auto-generated constructor stub

   }

   public News(String title, String autohor, Date date) {

     super();

     this.title = title;

     this.autohor = autohor;

     this.date = date;

   }

   @Override

   public String toString() {

     return "News [id=" + id + ", title=" + title + ", autohor=" + autohor + ", date=" + date + "]";

   }

  

  

}

@SequenceGenerator支持的属性

属性

是否必须

说明

name

该属性指定该主键生成器的名称

allocationSize

该属性指定底层 Sequence每次生成主键值的个数,对于Oracle而言,该属性指定的整数值, 将作为定义 Sequence时 increment by的值

schema

该属性指定将底层 Sequence放入指定shema中,如果不指定该属性,该 Sequence将放入默认的 schema中

catalog

该属性指定将底层Sequence放入指定 catalog中,如果不指定该属性,该 Sequence将放入默catalog中

initialValue

该属性指定底层Sequence的初始值。对于Oracle而言,该属性指定的整数值将作为定义Sequence时startwith的值

sequenceName

该属性指定底层Sequnece的名称

@TableGenerator支持的属性

属性

是否必须

说明

name

该属性指定该主键生成器的名称

allocationSize

该属性指定底层辅助表每次生成主键值的个数

catalog

该属性指定将辅助表放入指定catalog中,如果不指定该属性,该辅助表将放入默认的catalog中

schema

该属性指定将底层辅助表放入指定catalog中,如果不指定该属性,该辅助表将放入默认的schema中

table

指定辅助表的表明

initialValue

该属性指定的整数值将作为辅助表的初始值。默认值:0

pkColumnName

该属性指定存放主键名的列名

pkColumnValue

该属性指定主键名

valueColumnValue

该属性指定存放主键名的列名

indexes

该属性值是一个@Index数组,用于为辅助表定义索引

uniqueConstraints

该属性值是一个@UniqueConstraint数组,用于为辅助表创建唯一约束

主键生成策略

1.

@TableGenerator(name="newsGen",table="NEWS_ID_GEN",pkColumnName="gen_key",

   valueColumnName="gen_value",pkColumnValue="news_id")

   @TableGenerator(name="newsGen",table="NEWS_ID_GEN",

   pkColumnName="gen_key",valueColumnName="gen_value",

   pkColumnValue="news_id")

   //使用GeneratedValue.TABLE主键生成策略

@GeneratedValue(strategy=GenerationType.TABLE,generator="newsGen")

2.使用Hibernate的主键生成策略

@GenericGenerator注解支持的属性

  1. name:必须属性指定主键生成器的名称,可以被@GeneratedValue的generator属性引用
  2. strategy:必须属性。设置主键生成策略
  3. Increment:主键类型long、short、int类型,只有在没有其他进程往同一表中插入数据时使用
  4. Identity:DB2、MySQL、MicsortSQL Server、Sybase和HypersonicSQL等。主键类型long、short、Int类型
  5. SequenceDB2、PostgreSQL、Oracle、SAPDB、McKoi等主键类型:long、short、int
  6. Hilo:高低位高效算法long、short、int类型的标识符
  7. seqhilo :高低位高效算法long、short、int类型的标识符,需要给定一个Sequence的数据库名,如Oracle
  8. uuid:128位UUID算法生成字符串类型的标识符号,UUID被编码为一个32位十六进制数的字符串
  9. guid: 在MicsortSQLSever和MySQL中使用数据库生成GUID字符串
  10. native: 根据底层数据库的能力选择identity、Sequence、或hilo中一个
  11. assigned:让应用程序在save()之前为对象分配一个标识符。相当于在不指定主键生成策略所采用默认策略
  12. select: 通过数据库触发器选择某个唯一主键的行,并返回器主键值作为标识属性值
  13. foreign: 直接使用另一个关联的对象的标识属性值、这种主键生成器只用于1-1关联

 

猜你喜欢

转载自www.cnblogs.com/sundaysjava/p/10328299.html
今日推荐