Hibernate注解

来源:互联网 发布:阿里云服务器上搭建svn 编辑:程序博客网 时间:2024/06/04 01:38

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

创始人是:Gavin King

ORM(Object Relational Mapping)是为了解决面向对象与关系型数据库存在互不匹配现象的技术。
简单说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化的关系数据中。本质上就是将数据从一种形式转换到另外一种形式。

Hibernate注解的简介:
使用注解的目的:是为了简化繁琐的ORM映射文件(*.hbm)的配置。

JPA与Hibernate的关系:
JPA:(Java Persistence API )。是java持久化的API(应用程序接口Application Program Interface)接口。
API是操作系统留给应用系统的一个调用接口。
JPA注解是JAVAEE的规范和标准。
JPA与Hibernate的关系:JPA是标准接口,Hibernate是实现,但其功能是JPA的超集。

类注解:

1)
@Entity //实体类注解
@Id //设置数据库的主键
2)
@Table(name = “数据库表名” ,catalog=”“,schema=”“) //实体类对应的数据库实际的表名,不设置表名默认数据库表名与类名一致。
@Entity 配合使用,只能标注在实体的class的定义处,表示实体类对应数据库表的信息。
name:可选,映射表的名称,默认表名和实体名称一致,只有在不一致的情况下才需要指定表名。
catalog:可选,表示Catalog名称,默认为Catalog(“”)。
schema:可选,表示Schema名称,默认为Schema(“”)。

3)
@Embeddable
表示一个非Entity类可以嵌入到另一个Entity类中作为属性而存在。

属性级别注解:

添加方式:
一是写在属性字段上面
二是写在属性的get访问器的上面

@Id
@SequenceGenerator
@GeneratedValue
@Column
@Embedded
@EmbeddedId
@Lob
@Version
@Basic
@Transient

1)
@Id
必须的,定义了映射到数据库表的主键的属性,一个实体类可以有一个或者多个属性被映射为主键,可置于主键属性或者getXxxx()前。
注意:如果有多个属性定义为主键属性,该实体类必须实现serializable接口。
public class Student implements Serializable(

@Id
@Column (length=8)

2)
@GeneratdeValue(strategy=GenerationType,generator=”“)
可选,用于定义主键生成策略。
strategy表示主键生成策略,取值有:
1.GenerationType.AUTO:根据底层数据库自动选择(默认)auto_increment
2.GenerationType.INDENTITY:根据数据库的Identity字段生成
3.GenerationType.SEQUENCE:使用Sequence来决定主键的取值
4.GenerationType.TABLE:使用指定表决定主键取值,
结合@TableGenerator使用。

如:
@Id
@TableGenerator(name=”tab_cat_gen”,allocationSize=1)
@GeneratedValue(Strategy=Generationtype.Table)
Generator-表示主键生成器的名称,这个属性通常和ORM框架相关,例如:Hibernate可以指定uuid等主键生成方式。

@GeneratedValue(generator=”sid” )定义一个主键生成器。

@GeneratedValue(strategy=GenerationType.Auto)
JPA的生成策略。
下面的要用到hibenate的注解
@GeneratedValue(generator=”sid”)
@GenericGenerated(name=”sid”,strategy=”assigned //手工赋值”)

3)
@Column

可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用。

常用属性:
name: 可选,表示数据库表中字段的名称,默认情形属性名称一致。
nullable:可选,表示该字段是否允许为null,默认为true。
unique:可选,表示该字段是否是唯一标识,默认为false。
length:可选,表示该字段的大小,仅对String类型的字段有效,默认值255.(如果是主键不能使用默认值)。
insertable:可选,表示ORM框架执行插入操作时,该字段是否出现INSERT语句,默认为true.
updateable:可选,表示在ORM框架执行更新操作时,该字段是否应该出现UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段。

@GenericGenerator
声明了一个hibernate的主键生成策略。支持十三种策略。该注解有如下属性:
name 指定生成器名称。
strategy 指定具体生成器的类名(指定生成策略)。
parameters 得到strategy指定的具体生成器所用到的参数。

其十三种策略(strategy属性的值)如下:
● native
对于orcale采用Sequence方式,对于MySQL和SQL Server采用identity(处境主键生成机制),native就是将主键的生成工作将由数据库完成,hibernate不管(很常用)
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “native”)
● uuid
采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型)。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “uuid”)
● hilo
要在数据库中建立一张额外的表,默认表名为hibernate_unque_key,默认字段为integer类型,名称是next_hi(比较少用)。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “hilo”)
● assigned
在插入数据的时候主键由程序处理(很常用),这是元素没有指定时的默认生成策略。等同于JPA中的AUTO。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “assigned”)
● identity
使用SQL Server和MySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQL和SQL Server中很常用)。等同于JPA中的IDENTITY
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “identity”)
● select
使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “select”)
● sequence
调用谨慎数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “sequence”, parameters = { @Parameter(name = “sequence”, value = “seq_payablemoney”) })
● seqhilo
通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持Sequence的数据库,如Orcale(比较少用)。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “seqhilo”, parameters = { @Parameter(name = “max_lo”, value = “5”) })
● increnment
插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “increnment”)
● foreign
使用另一个相关的对象的主键。通常和@OneToOne联合起来使用。
例:@Id
@GeneratedValue(generator = “idGenerator”)
@GenericGenerator(name = “idGenerator”, strategy = “foreign”, parameters = { @Parameter(name = “property”, value = “info”) })
Integer id;

   @OneToOne   EmployeeInfo info;

● guid
采用数据库底层的guid算法机制,对应MySQL的uuid()函数,SQL Server的newid()函数,ORCALE的rawtohex(sys_guid())函数等。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “guid”)
● uuid.hex
参见uuid,建议用uuid替换。
● sequence-identity
sequence策略的扩展,采用立即检索策略来获取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “sequence-identity”, parameters = { @Parameter(name = “sequence”, value = “seq_payablemoney”) })

  1. @Transient
    声明了非持久化属性,即数据库中没有相应的映射字段,是一个普通属性。
  2. @Temporal
    声明了日期类型。
    TemporalType.DATE 日期,例:2011-04-12
    TemporalType.TIME 时间,例:22:50:30
    TemporalType.TIMESTAMP 日期和时间,例:2011-04-12 22:51:30
  3. @Version
    声明了对乐观锁定的支持
    例:@Version
    @Column(name=”OPTLOCK”)
    public Integer getVersion() { … }
    上面这个例子中,version属性将映射到 OPTLOCK列,entity manager使用该字段来检测更新冲突(防止更新丢失,请参考last-commit-wins策略)。
    根据EJB3规范,version列可以是numeric类型(推荐方式)也可以是timestamp类型。Hibernate支持任何自定义类型,只要该类型实现了UserVersionType。

关系映射级别的注解:

1、一对一单项外键
2、一对一双外键关联
3、一对一单向外键联合主键
4、多对一单向外键关联
5、一对多单向外键关联
6、一对多双向外键关联
7、多对多单向外键关联
8、多对多双向外键关联

实体之间的映射关系
一对一:一个公民对应一个身份证
一对多(多对一):一个人有多个银行卡
多对多:一个学生有多个老师,一个老师对应多个同学

1 0