hibernate注解

慕课网:http://www.imooc.com/learn/524

一、类级别注解

  1. 简介

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

JPA(Java Persistence API)与hibernate的关系:JPA是标准接口,hibernate是实现(hibernate的功能是jpa的超集,功能更强大)

hibernate如何实现与JPA的关系:通过hibernate-annotation、hibernate-entitymanager、hibernate-core三个组件来实现

一般在实际开发中,优先考虑使用JPA注解,有利于移植和扩展

hibernate注解的分类:

    • 类级别注解

      • @Entity:实体类--对应数据库的表
      • @Table:
      • @Embeddable:嵌入类
    • 属性级别注解
    • 映射关系注解
  1. 准备工作
  2. @Entity

@Entity:映射实体类

@Entity(name="tableName")

name:可选,对应数据库中的一个表。若表名与实体名相同,则可以省略。

注:使用@Entity时必须指定实体类的主键属性。

  1. @Table(name="",catalog="",schema="")

与@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表信息。

name:可选,映射表名称,默认表名和实体名一致,只有在不一致的情况下才需要指定表名。

catalog:可选,表示catalog名称,默认为catalog("")

schema:可选,表示schema名称,默认为schema("")

  1. @Embeddable

表示一个非Entity类,可以嵌入到另一个实体类中作为属性而存在。

二、属性级别注解

添加方式:

  • 写在属性字段上面
  • 写在属性的get访问器上面

重要:@Id、@GeneratedValue、@Column、@Embedded、@EmbeddedId、@Transient

@SequenceGenerator、@Lob、@Version、@Basic。。

1.Id

@Id:必须,定义了映射到数据库表的主键属性,一个实体类可以有一个或者多个属性被映射为主键,可以置于主键属性或者getXxx()前

注意:如果有多个属性定义为主键属性,该实体类必须实现serializable接口。

2.GeneratedValue

@GeneratedValue(strategy=GenerationType,generator=""):可选,用于定义主键生成策略。

strategy表示主键生成策略,取值有:

  • GeneratedType.AUTO:根据地层数据库自动选择(默认)

    • 字符串类型主键不能使用 GeneratedType.AUTO,可以使用  @GeneratedValue(generator="id")[email protected](name="id",strategy="assigned/uuid")
  • GeneratedType.IDENTITY:根据数据库的Identity字段生成
  • GeneratedType.SEQUENCE:使用Sequence来决定主键的取值
  • GeneratedType.TABLE:使用指定表来决定主键取值,结合@TableGenerator使用

如:

@Id

@TableGenetor(name="tab_cat_gen",allocationSize=1)

@GeneratedValue(strategy=GenerationType.Table)

Genetor-表示主键生成器的名称,这个属性通常和ORM框架有关

例如:Hibernate可以指定uuid等主键生成方式

  1. @Column

@Column:可以讲属性映射到列,使用该朱姐来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成

数据库表结构的工具非常有用

常用属性:

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

[email protected]

@Embedded是注释性的,表示该属性的类是嵌入类

注意:同时嵌入类也必须标注@ Embeddable 注解

[email protected]

@EmbeddedId使用嵌入式逐渐类实现复合主键。

注意:嵌入式主键类必须实现Serializable接口,必须有默认的public无参数构造方法,必须覆盖equals和hashCode方法。

[email protected]

可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就无比将其标示为@Transient,否则ORM框架默认其注解为@Basic。

三、关联映射注解

实体之间的映射关系:

  • 一对一:一个公民对应一个身份证号码
  • 一对多(多对一):一个公民有多个银行账号
  • 多对多:一个学生多个老师,一个老师教多个学生

1. 一对一单向外键

  • @OneToOne(cascade=CascadeType.ALL)

    • cascade:级联关系
  • @JoinColumn(name="pid",unique=true)

注意:保存时应先保存外键对象,再保存主表对象

2. 一对一双向外键关联

  • 主控方的配置同一对一单向外键关联
  • 被控方添加@OneToOne(mappenBy="card")

注意:双向关联,必须设置mappedmappedBy属性。因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双方都无法保存。

  1. 一对一双向外键联合主键
  • 创建主键类
  • 主键类必须实现serializable接口,重写hashCode()和equals()方法。

主键类:@Embeddeble

实体类:@EmbeddedId

4.多对一单向外键关联

  • 多方持有一方的引用,比如:多个学生对应一个班级(多对一)

@ManyToONe(cascade={CascadeTypie.ALL},fetch=FetchType.EAGER) cascade:级联关系 fetch:抓取策略

@JoinColumn(name="cid",refencedColumnName="CID")

5.一对多单向外键关联

  • 一方持有多方的集合,一个班级有多个学生(一对多)

@OneToMany(cascade={CascadeType.ALL},fetcj=FetchType.LAZY)

@JoinColumn(name="cid")

总结:多对一的时候,多方设置EAGER,一方设置LAZY

6.一对多(多对一)双向外键关联

  • 多方:多方持有一方的引用

@ManyToONe(cascade={CascadeTypie.ALL},fetch=FetchType.EAGER) cascade:级联关系 fetch:抓取策略

@JoinColumn(name="cid")

  • 一方:一方持有多方的集合

@OneToMany(cascade={CascadeType.ALL},fetcj=FetchType.LAZY)

@JoinColumn(name="cid")

7.多对多单向外键关联

  • 学生和教师构成多对多的关联关系
  • 其中一个多方持有另一个多方的集合对象(学生持有教师的集合)
  • 创建中间表

// 学生类

@ManyToMany

@JoinTable(

name="teachers_students",

joinColumns={@JoinColumn(name="sid")},

inverseJoinColumns={@JoinColumn(name="tid")}

)

8.多对多双向外键关联

  • 双方都持有对方的集合对象,其中一方设置

// 教师类

@ManyToMany(mappedBy="teachers")

  • 另一方:

// 学生类

@ManyToMany

@JoinTable(

name="teachers_students",

joinColumns={@JoinColumn(name="sid")},

inverseJoinColumns={@JoinColumn(name="tid")}

)

四、总结

1.类级别注解

@Entity @Table @Embeddable

2.属性级别注解

@Id @GeneratedValue @Column @Embeded @EmbededId @Transient

3.映射关系注解

一对一单向外键:@OneToOne

一对一双向外键关联:@OneToOne(mappedBy="xxx")

一对一单向外键联合主键:@Embeddable @EmbeddedId

多对一单向外键关联:@ManyToOne @JoinColumn

一对多单向外键关联:@OneToMany @JoinColumn

一对多双向外键关联: @ManyToOne  @OneToMany  @JoinColumn

多对多单向外键关联:@ManyToMany @JoinTable

多对多双向外键关联: @ManyToMany(mappedBy="xxx") @JoinTable

时间: 2024-10-10 12:25:56

hibernate注解的相关文章

Hibernate学习一:Hibernate注解CascadeType

http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hibernate学习一:Hibernate注解CascadeType 博客分类: Hibernate hibernate 一.概念 现有一场景:一个管理员可以管理多个网吧,一个网吧可以被多个管理员管理.从中抽象出一个多对多的例子user-bar. 主控方user:多对多里面里面会有第三张表user_b

(十) 使用Hibernate 注解

Hibernate里有两种注解 : Hibernate 注解 JPA注解 主键生成机制 : http://www.cnblogs.com/ph123/p/5692194.html 案例一:   用注解对非复合主键的表生成配置文件 package bean; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.p

Hibernate注解总结:

Hibernate注解总结: 首先我们都知道Hibernate框架是持久层的一个框架,用于对数据的访问和操作.个人觉得其强大就在于它可以使用HQL语句来进行快速的增.删.改的操作,也可以使用Sql语句来进行数据操作,很是方便快捷,备受大型项目青睐,之前所做的都是用的MyBatis感觉比MyBatis要方便些.但是有些人会认为说开发人员理应熟练使用sql语句,对MyBatis更欢迎.智者见智仁者见仁.我就从我平时使用的注解说起吧: @id:这个想必大家都不会陌生的,在实体类中定以主键的标识. @E

关于hibernate注解的简单应用

@Override 用途:重写父类的同名方法 单元测试注解 @Test 用途:用于测试 @Before 用途:单测方法走之前执行 @After 用途:单测方法走之后执行 注解的目标:替换小配置.替换hbm文件 @Entity  :标识实体类(被持久化) @Table  :DB层表的名称 @Transient :不持久化某个属性 @Column:数据表中的字段名 @GenerateValue :主键生成策略 -----------------关联--------------------------

Hibernate注解映射联合主键的三种主要方式(转载)

转自:http://blog.csdn.net/robinpipi/article/details/7655388 联合主键用hibernate注解映射方式主要有三种:第一.将联合主键的字段单独放在一个类中,该类需要实现Java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并生成set和get方法,并将该引用注解为@Id 第二.将联合主键的字段单独放在一个类中,

【学习笔记】Hibernate 注解 (Y2-1-9)

Hibernate注解 1.什么是注解在类上或者方法上打上其他类型的类型元数据 @标志 使用过的注解: @override  方法重写 @Test Junit 单元测试 @Before 单元测试 @After 单元测试 Hibernate中常用的注解 [email protected] 将一个类声明为持久化类 [email protected] 声明持久化类的标识属性 [email protected] 定义标识属性值的生成策略,默认为native [email protected] 将属性映射

hibernate注解解析

最近学习hibernate注解形式配置POJO类,将注解的解析记下来,以备以后使用. 例1. @Entity@Table(name="user")  public class Flight implements Serializable {    Long id; @Id @GeneratedValue(generator="generator") @GenericGenerator(name="generator", strategy = &q

SHOP++ 中Hibernate 注解 用法

最近接触到一款JAVA开源软件(shop++)这是一款电商软件.然后看了这款软件的源代码,发现真的很强大.框架采用的是spring mvc + hibernate + freemarker ,代码结构层次分明,代码封装和重用性也很高.非常适合二次开发.其次重点说说hibernate 注解吧 数据库表采用的是hibernate注解映射的方式.然后略微研究了下,分享一下自己的见解. @Entity说明此类是一个实体映射 @Tabletable用来定义entity主表的name,cataloh,sch

【Hibernate注解】

Hibernate注解不仅可以替换复杂的映射文件,甚至可以逆向生成数据库表 1.需要导入的jar包类列表 hibernate-annotations.jar hibernate-commons-annotations.jar ejb3-persistence.jar 2.配置实体类的常用注解 @Entity 将一个类声明为实体Bean(即一个持久化POJO类) @Id 声明该实体Bean的标识属性(相当于数据表的主键) @GeneratedValue 定义标识符的生成策略 @Table 为实体B