首页 > 代码库 > Hibernate-----Hibernate注解

Hibernate-----Hibernate注解

可用Hibernate的映射文件代替

注解API定义在javax.persistence.*包里面


@Entity

将一个类声明为一个实体bean(即一个持久化POJO)

name:指定数据库表的名字


@Table

声明该实体bean映射指定的表;表示实体对应的数据库表的信息,通常和@Entity使用

name:表的名字(默认和实体名一致)

catalogCatalog的名称(默认Catalog(“”))

schemaSchema的名称(默认Schema(“”))

 

@Id

声明该实体bean的标识属性(对应表中的主键);一个实体只能有一个属性被映射为主键


@Column

声明属性到列的映射;描述了数据库表中该字段的详细定义
name
:列名(默认值是属性名)
unique
:该列是否唯一约束(默认值false
nullable
:该列的值是否可为空(默认值true
insertable
:该列是否作为生成的insert语句中的一个列(默认值true
updatable
:该列是否作为生成的update语句中的一个列(默认值true);对于已经创建就不可更改的字段,该属性非常有用,如birthday字段
columnDefinition
:表示该字段在数据库中的实际类型,通常ORM框架可根据属性类型自动判断数据库中字段的类型,但对于Date类型仍无法确定数据库中字段类型究竟是DATE TIME还是TIMESTAMP;此外,String的默认映射类型为VARCHAR,若要将String类型映射到特定数据库的BLOBTEXT字段类型;该属性非常有用;(为这个特定列覆盖sqlddl片段:这可能导致无法在不同数据库间移植)
table
:定义对应的表(默认为主表)
length
:列长度(默认值255);仅对String类型的字段有效
precision
:列十进制精度(decimalprecision)(默认值0
scale
:如果列十进制数值范围(decimalscale)可用,在此设置(默认值0


@GeneratedValue

声明主键的生成策略
strategy
:指定生成的策略(JPA定义的,这是一个GenerationType

                  AUTO:让ORM框架自动选择(默认)
                  TABLE
:使用一个特定的数据库表来保存主键
                  IDENTITY
:根据数据库表的Identity字段生成;
                  SEQUENCE
:根据数据库表的Sequecne字段生成;(与generator一起使用)

generator指定生成主键使用的生成器(可能是orcale中的序列)

@Id
@GeneratedValue(strategy=StrategyType.SEQUENCE)
public int getPk(){
   return pk;
}

@SequenceGenerator

声明一个数据库序列

name:该表主键生成策略名称,它被引用在@GeneratedValue的“gernerator值中

sequenceName:生成策略用到的数据库序列名称

initialValue:主键初始值(默认0

allocationSize:每次主键值增加的大小(默认50

 

@GenericGenerator

声明一个hibernate的主键生成策略

name:指定生成器名称

strategy:指定具体生成器的类名(指定生成策略)

parameters:得到strategy指定的具体生成器所用到的参数

 

十三种策略(strategy属性的值)如下:

1)、native

@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="native")

2)、uuid:采用128位的uuid算法生成主键,uuid被编码为一个3216进制数字的字符串。

占用空间大(字符串类型)

3)、hilo

4)、assigned<generator>元素没指定时的默认生成策略。等同于JPA中的AUTO

5)、identity

6)、select:使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)

7)、sequence:要设定序列名,不然hibernate无法找到
@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="sequence",
parameters={@Parameter(name="sequence",value=http://www.mamicode.com/"seq_payablemoney")})

8)、seqhilo通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持Sequence

的数据库 (比较少用)
@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="seqhilo",
parameters={@Parameter(name="max_lo",value=http://www.mamicode.com/"5")})

9)、increnment

10)、foreign使用另一个相关的对象的主键。通常和<one-to-one>联合起来使用

@Id

@GeneratedValue(generator="idGenerator")

@GenericGenerator(name="idGenerator",strategy="foreign",

parameters={@Parameter(name="property",value=http://www.mamicode.com/"info")})

Integerid;


@OneToOne
EmployeeInfoinfo;

11)、guid:采用数据库底层的guid算法机制,对应MySQLuuid()函数,SQLServernewid()

函数,ORCALErawtohex(sys_guid())函数等

12)、uuid.hex

13)、sequence-identitysequence策略的扩展,采用立即检索策略来获取sequence值,需

JDBC3.0JDK4以上(含1.4)版本

@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="sequence-identity",
parameters={@Parameter(name="sequence",value=http://www.mamicode.com/"seq_payablemoney")})

 

@Transient

表示该属性并非一个岛数据库表的字段的映射,ORM框架将忽略该属性

// 根据birth计算出age属性

@Transient

Public int getAge(){
   return getYear
new Date())-getYearbith);

}

 

@Basic

表示一个简单的属性岛数据库表的字段的映射,对于没有任何标注的getXxx()方法,默认即为@Basic

fetch:该属性的读取策略(EAGER:主支抓取;默认,LAZY:延迟加载)

optional:该属性是否允许为null(默认true


@OneToOne

一对一关联的映射

cascade:级联操作策略(默认无级联操作);

PERSIST:级联新建

REMOVE:级联删除

REFRESH:级联刷新

MERGE:级联更新

ALL:全部四项

组合


方法一
主表:@OneToOne(cascade=CascadeType.ALL)
      @PrimaryKeyJoinColumn
      public
从表类get从表类(){return从表对象}
从表:没有主表类
注意:这种方法要求主表与从表的主键值相对应


方法二
主表:@OneToOne(cascade=CascadeType.ALL)
      @JoinColumn(name="
主表外键") //这里指定的是数据库中的外键字段
      public
从表类get从表类(){return从表类}
从表:@OneToOne(mappedBy="主表类中的从表属性") //例主表User中有一个从表属性是Heart类型的heart,这里就填heart
      public
主表类get主表类(){return主表对象}
注意:@JoinColumn是可选的。默认值是从表变量名+"_"+从表的主键(注意,这里加的是主键。而不是主键对应的变量)。


方法三
主表:@OneToOne(cascade=CascadeType.ALL)
      @JoinTable(name="
关联表名",
                 joinColumns=@JoinColumn(name="
主表外键"),
                 inverseJoinColumns=@JoinColumns(name="
从表外键"))
从表:@OneToOne(mappedBy="主表类中的从表属性") //例主表User中有一个从表属性是Heart类型的heart,这里就填heart
      public
主表类get主表类(){return主表对象}


@ManyToOne

多对一关联的映射;该注解标注的属性通常是数据库表的外键

fetch:抓取策略;指定是否延迟加载(LAZY:延迟加载,默认;EAGER:立即加载)

optional:是否允许该字段为null;该属性应该根据数据库表的外键约束来确定(默认为true

cascade

targetEntity:另一个实体类的全限定名;通常不必指定,ORM框架根据属性类型自动判断


方法一
@ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name="
外键名")
public
主表类get主表类(){return主表对象}
方法二
@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name="关联表名",
           joinColumns=@JoinColumn(name="主表外键"),
           inverseJoinColumns=@JoinColumns(name="从表外键")
)

 

@JoinColumn

@Column类似,这里描述的不是一个简单字段,而是一个关联字段;如描述一个@ManyToOne的字段

name:该字段的名称,(默认名称:关联实体名_关联实体的主键名)

如实体Order有一个user属性来关联实体User,则Orderuser属性为一个外键;其默认的名称为【实体User的名称_实体User的主键名称】


@OneToMany

设置一对多关联。该属性应该为集体类型,在数据库中并没有实际字段

cascade:对于OnewToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除

fetch

mappedBy:只有OneToOneOneToManyManyToMany上才有该属性;该属性指向关系的维护端(维护级联关系)


方法一
@OneToMany(mappedBy="
‘多端‘的属性")
publicList<
多端”>get多端”列表(){return多端”列表}

使用这种配置,在为“一端”添加“多端”时,不会修改“多端”的外键。在“一端”加载时,不会得到“多端”。如果使用延迟加载,在读“多端”列表时会出异常,立即加载在得到多端时,是一个空集合(集合元素为0

方法二
@OneToMany(mappedBy="
多端”的属性")
@MapKey(name="
多端”做为Key的属性")
publicMap<
多端”做为Key的属性的类,主表类>get多端”列表(){return多端”列表}

方法三
@OneToMany
@JoinColumn(name="“多端外键")
publicList<“多端类>get“多端列表(){return“多端列表}
使用这种配置,在为“一端”添加“多端”时,可以修改“多端”的外键。
“一端”配置

@ManyToMany

设置多对多的关联映射;中间表由ORM框架自动处理

targetEntity:

mappedBy:另一个实体类的对应集合属性名称

User实体表示用户,Book实体表示书籍,为了描述用户收藏的书籍
    @Entity
    public class User {
       private List books;
      @ManyToMany(targetEntity=package.Book.class)
       public List getBooks() {
           return books;
       }
    }

    @Entity
   public class Book {
       private List users;
      @ManyToMany(targetEntity=package.Users.class,mappedBy="books")
       public List getUsers() {
           return users;
       }
    }

两个实体间相互关联的属性必须标记为@ManyToMany,并相互指定targetEntity属性,有且只有一个实体的@ManyToMany注解需指定mappedBy属性
利用ORM工具自动生成的表除了User和Book表外,还自动生成了一个User_Book表,用于实现多对多关联

 

Hibernate验证注解

注解

适用类型

说明

示例

@Pattern

String

通过正则表达式来验证字符串

@attern(regex=”[a-z]{6}”)

@Length

String

验证字符串的长度

@length(min=3,max=20)

@Email

String

验证一个Email地址是否有效

@email

@Range

Long

验证一个整型是否在有效的范围内

@Range(min=0,max=100)

@Min

Long

验证一个整型必须不小于指定值

@Min(value=http://www.mamicode.com/10)

@Max

Long

验证一个整型必须不大于指定值

@Max(value=http://www.mamicode.com/20)

@Size

集合或数组

集合或数组的大小是否在指定范围内

@Size(min=1,max=255)

以上每个注解都可能有一个message属性,用于在验证失败后向用户返回的消息

 

Hibernate-----Hibernate注解