Hibernate常用注解

来源:互联网 发布:绝地求生优化教程 编辑:程序博客网 时间:2024/06/13 16:58

1.对于Hibernate PO类而言,通常使用下面两个注解来修饰它:

    1.@Entity:被该注解修饰的POJO就是一个实体,    2.@Table:指定该PO类所映射的表,有属性:        catalog:将对应的表放入指定的catalog中,未指定时系统放入默认的catalog中;        schema:将对应的表放入指定的schema中,未指定时系统放入默认的schema中;        indexes:为对应的表设置索引,属性值为@Index注解数组;name:指定所映射的表名;        uniqueConstaints:指定是否为对应的表设置唯一约束

Hibernate还为PO类提供了如下特殊的注解:

    1.@DynamicInsert:指定insert语句是否在运行时动态生成,并且只插入那些非空字段。默认false    2.@DynamicUpdate:指定update语句是否在运行时动态生成,并且只更新那些非空字段。默认false    3.@SelectBeforeUpdate:指定Hibernate在更新某个持久化对象之前是否先进行一次查询,如果设置为true,则可以保证只有当持久化对象的状态被修改过时才会使用update,否则就算打开了,什么都没改,使用saveOrUpdate()语句也一样使用save()方法来保存    4,@Where:该注解有一个clause属性,可以指定一个附加的SQL语句过过滤条件。形如:@Where(clause="username='chengxi')    5.@Check:该注解有一个constraints属性,可以指定一个SQL表达式,用于为该持久化类对应的表指定一个check约束

2.Hibernate为属性映射提供了如下的注解:

    @Column@Formula:该注解的value属性指定一个sql表达式,返回的值传递给修饰的属性,该属性的属性值是动态计算出来的,在PO类对应的底层数据库表是没有保存该属性对应的记录的,因为无须保存@Formula(value="()")    @Generated:设置该属性映射的数据列的值是否由数据库生成,该注解的value属性值:GenerationTime.NEVER/INSERT/ALWAYS,分别为不由数据库生成、只在执行insert时生成、在执行insert和update时都会重新生成

3.使用@Transient修饰不想保存到底层数据库的属性

@Entity@Table(name="stu_inf")public class stu {    private String username ;    private String password ;    @Transient    private String content ;    //omit setter and getter methods}

4.使用@Lob、@Basic修饰大数据类型的属性(图片、字符串文章等)
在数据库中,通常使用Blob和Clob类型来保存大数据,而JDBC则采用java.sql.Blob和java.sql.Clob来表示这些大数据类型的值。Hibernate提供了@Lob注解来指定PO类的大数据属性在数据库所对应的数据的类型:当PO类的属性为byte[]/Byte[]/java.lang.Serializable类型时,@Lob修饰的属性将被映射为Blob;当PO类的属性为char[]/Character[]/java.lang.String类型时,修饰的属性将被映射为Clob

    ...    //如下pic属性将被映射为Blob类型的数据列    @Lob    @Column(name="pic")    private byte[] pic ;

而@Basic则指定是否对大数据进行延迟加载,当我们对包含大数据列的表对应的PO类进行相关操作时,每次操作都会将其中的大数据也同时查询出来,这样讲会大幅度延长数据库操作的时间,因此我们可以使用@Basic来修饰指定大数据属性来延迟加载,也就是暂时不加载,返回一个未初始化的代理,当对该数据列进行操作时,才真正从数据库里查询出来。该注解可以指定如下属性:fetch:指定是否延迟加载,有两个值:FetchType.EAGER、FetchType.LAZY;optional:指定该属性映射的数据列是否允许使用null值

    ...    @Lob    @Column(name="pic")    @Basic(fetch=FetchType.LAZY)    private byte[] pic ;

5.使用@Temporal修饰日期类型的属性:对于java而言,有两种类型可以分别表示日期和时间:java.util.Date和java.util.Calendar;对于数据库而言,有很多表示日期和时间的,常用的有:java.sql.date/java.sql.time/java.sql.timestamp等等。Hibernate同样提供了注解用于指定PO类中的日期类型属性到底是对应于数据库中的那种类型的日期。该注解一个value属性值有:TemporalType.DATE/TIME/TIMESTAMP

    ...    @Column(name="time")    @Temporal(TemporalType.DATE)    private Date time ;    //omit setter and getter methods

6.定义主键可以使用@Id指定,如果希望Hibernate为逻辑主键自动生成主键值,则还需要使用@GeneratedValue来修饰实体的标识属性。该注解有如下几个属性:
strategy:指定Hibernate对该主键采用怎样的主键生成策略:GenerationType.AUTO/IDENTITY/SEQUENCE/TABLE,分别为:自动选择最适合当前数据库的主键生成策略、对于SQL数据库采用自增长、主要用于Oracle、使用辅助表来生成主键,需要与@TableGenerator一起使用;
generator:当使用TABLE主键生成策略时,该属性引用@TableGenerator所定义的生成器的名称

@TableGenerator注解用于定义主键生成器,会在底层数据库中额外生成一个辅助表,其属性如下:
name:指定主键生成器的名称
allocationSize:指定每次生成的主键值的个数
catalog/schema:同@Table
initialValue:指定辅助表的初始值,默认为0
pkColumnName:指定存放主键名的列名
valueColumnName:指定存放主键值的列名
pkColumnValue:指定主键名
indexes:为辅助表定义索引,属性值为一个@Index注解数组
uniqueConstraints:为辅助表创建唯一约束,属性值为一个@UniqueConstraint注解数组

    ...    @Id    @GeneratedValue(strtagy=GenerationType.TABLE,generator="newGen")    @TableGenerator(name="newGen",table="newgen_inf"),pkColumnName="gen_key",valueColumnName="gen_value",pkColumnValue="new_id")    private Integer id ;    //在底层数据库中将创建一个辅助表:newgen_inf    column  gen_key    gen_value    value   new_id         0

7.映射集合属性:Hibernate要求PO类的集合值字段的类型必须声明为接口类型,如Set/Map/Collection等, 而不能声明为HashSet等实现类类型,也可以是自定义接口,只要实现了接口:org.hibernate.usertype.UserCollectionType。Hibernate对所有的集合类型统一使用@ElementCollection注解进行映射,该注解有如下几个属性:
fetch:指定是否对修饰的该集合属性进行延迟加载
targerClass:指定集合属性中集合元素的类型

    ...    @Column(name="setparam")    @ElementCollection(fetch=FetchType.LAZY,targetClass=String.class)    private Set<String> setparam = new HashSet<String>() ;    //omit setter and getter methods

Hibernate还使用了@CollectionTable注解来映射保存集合属性的表,主要用于当我们使用另一个表来保存集合属性的情况。该注解有如下几个属性:
name:指定保存集合属性的数据表的表名
indexes/catalog/schema:同@Table
joinColumns:指定外键列,该属性值为@JoinColumn注解数组
uniqueConstraints:为PO类映射的表设置唯一约束,该属性值为@UniqueConstraint注解数组

@JoinColumn注解用于定义外键列,该注解有如下属性:
name:指定该外键列的列名
table:指定该列所在的数据表的表名
referncedColumnName:指定该列参照的主键列的列名

如果想要映射带有索引的集合,可以为集合元素所在的数据表指定一个索引列,该索引列可以用于保存数组索引、List的索引、Map集合的Key索引。用于映射索引列的注解有两个:
@OrderColumn:用于定义List集合和数组的索引列
@MapKeyColumn:用于映射Map集合的索引列

    ...    @Column(name="listparam")    //指定集合属性的元素类型    @ElementCollection(targetClass=String.class)    //映射保存集合属性的表    @CollectionTable(name="newgan",table="new_gan",pkColumnName="pk_key",pkColumnValue="pk_value",valueColumnName="new_id",joinColumns=@JoinColumn(name="new_id"))    //映射集合元素的索引列    @OrderColumn(name="list_order")    private List<String> listparam = new ArrayList<String>() ;    //omit setter and getter methods

8.有序集合映射:Hibernate支持两种有序集合类型:SortedSet和SortedMap,当需要使用有序集合来作为PO类的成员变量时,Hibernate提供@SortNatural和@SortComparator两个注解,前者表名对集合元素采用自然排序,后者表示对集合元素采用定制排序,后者需要踢欧冠呢个一个value属性,该属性值为Comparator实现类

9.映射数据库对象,最常用的方法是在Hibernate映射文件中使用,使用该元素可以让HIbernate映射文件拥有完全定义用户Schema的能力,如下:

<hibernate-mapping>    <database-object>        <create> create trigger t_g ...</create>        <drop> create trigger t_g</drop>    </database-object></hibernate-mapping>

其实里面不止是可以定义触发器、存储过程等数据库对象,对于能使用java.sql.Statement.execute()方法执行的sql语句都能在此使用,比如下面:

<hibernate-mapping>    <!--每个数据库映射元素只能包含一组create和drop -->    <database-object>        <create>create table test(test varchar(200)</create>        <drop></drop>    </database-object></hibernate>

10.映射组件属性:当PO类的属性不是基本数据类型,而是一个复合类型的对象,需要使用映射注解来修饰:@Embeddable,使用该注解修饰的类能被作为持久化类的组件使用

public class News {    ...    private Name name ;    //omit setter ang getter methods}@Embeddablepublic class Name{    @Column(name="username")    private String username ;    @Column(name="password")    private String password;    @Parent    private News news ;    public Name() {    }    public Name(String username,String password){        this.username = username ;        this.password = password ;    }}

也可以直接使用@Embedded+@AttributeOverrides在PO类里直接修饰该复合类型的属性

    ...    @Embeeded    @AttributeOverrides({@AttributeOverride(name="name",        column=@Column(name="username"),        AttributeOverride(name="pass",            column = @Column(name="password")})    private Name name ;    //omit setter and getter methods    

当集合的元素类型为组件类型时,我们只需要简单删除原来的@Column注解就行了

11.使用组件作为复合主键:该组件类必须满足如下三个条件:
1.有无参数的构造器
2.必须实现java.io.Serializable接口
3.最好重写equals()和hashCode()方法,这样可以根据组件类的关键属性来区分组件对象

public class Name implements java.io.Serializable {    private String username ;    private String password ;    //omit setter and getter methods    //提供无参数的构造器    public Name() {    }    //提供初始化全部成员变量的构造器    public Name(String username , String password) {        this.username = username ;        this.password = password ;    }    //重写equals方法    public boolean equals(Object obj) {        if(this == obj)            return true ;        if(obj != null && obj.getClass() == Name.class) {            Name target = (Nmae)obj ;            return target.getUsername().equals(getUsername()) ;        }        return false ;    }    //...}//Hibernate PO类@Entity@Table(name="person")public class Person {    @EmbeddedId    @AttributeOverrides({@AttributeOverride(name="name",        column=@Column(name="username"),        AttributeOverride(name="pass",            column = @Column(name="password")})    private Name name ;    //omit setter and getter methods}
0 0
原创粉丝点击