JPA与Hibernate关系:JPA是标准接口,Hibernate是实现,其功能是JPA的超集
Hibernate如何实现与JPA的关系:通过hibernate-annotation,hibernate-entitymanager和hibernate-core三个组件来实现,这里给大家总结一些常用到的注解。

 

1,类级别注解:

@Entity:表示映射一个实体类,与数据库一张表对应。使用该注解时必须指定实体类的主键属性。
    @Entity(name="tableName"),name可选,对应数据库的一个表,若表明与实体类名相同,则可以省略。

@Table:
    @Table(name="",schema="",catalog=""),与@Entity配合使用,只能标注在实体的class定义处,表示实体对应数据库表的信息。
    name:可选,映射表的名称
    catalog:可选,表示Catalog(目录)名称,默认为空Catalog("")。
    schema:可选,表示Schema(模式)名称,默认为空Schema("")。
    schema与catalog:数据库系统——Catalog——Schema——表,视图,字段

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

 

2,属性级别注解:

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

@Id:必须的,定义映射到数据库表的主键属性,一个实体类可以有一个或者多个属性被映射为主键,如果一个实体类定义了多个属性为主键,那么该实体类必须实现serializable接口

@GeneratedValue:
    @GeneratedValue(strategy=GenerationType,generator=""):可选,用于定义主键生成策略
    strategy表示主键生成策略,取值有:
        GenerationType.AUTO:根据底层数据库自动选择(默认)

@Column:可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中该字段的详细定义
    name:可选,表示数据库中该字段的名称,默认情形属性名称一致
    nullable:可选,表示该字段是否允许为null,默认为true
    unique:可选,表示该字段是否是唯一标识,默认为false
    length:可选,表示该字段的大小,仅对String类型的字段有效,默认值255,如果是主键不能使用默认值
    insertable:可选,表示在ORM框架执行插入操作时,该字段是否应该出现INSERT语句中,默认值为true
    updateable:可选,表示在ORM框架执行更新操作时,该字段是否应该出现UPDATE语句中,默认值为true,对于一经创建就不能修改的字段,该属性非常有用,例如birthday字段

@Embedded:表示该属性的类是嵌入类,同时嵌入类也必须标注@Embeddable注解

@EmbeddedId:使用嵌入式主键实现复合主键,嵌入式主键必须实现serializable接口,必须有默认的public无参的构造方法,必须覆盖equals和hashCode方法

@Lob:表示属性将被持久化为Blob或者Clob类型

@Version:声明添加对乐观锁定的支持

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

 

3,映射关系注解:

一对一单向外键关联:保存时应先保存外键对象,再保存主表对象。
    @OneToOne(cascade=CascadeType.ALL),cascade级联关系
    @JoinColum(name="pid",unique=true)

一对一双向外键关联:主控方的配置同一对一单向外键关联。双向关联,必须设置mappedBy属性,因为双向关联只能交给一方去控制,不能在双方都设置外键保存关联关系,否则双方都无法保存。
    @OneToOne(mappedBy="card")//被控方
    
一对一双向外键联合主键
    创建主键类,添加类注解@Embeddable,实体类添加@EmbeddedId
    主键类必须实现serializable接口,重写hashCode()和equals()方法
    
多对一单向外键关联:多对一,多方设置EAGER
    @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER),fetch为抓取策略,EAGER为渴望的积极地
    @JoinColum(name="cid",referencedColumnName="CID"),referencedColumnName表示映射到数据库表里面外键名称(自己修改的名称)

一对多单向外键关联:一对多,一方设置LAZY
    @OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY),LAZY表示懒加载
    @JoinColum(name="cid")
    
(一对多)多对一双向外键关联    
    多方:多方持有一方的引用
    @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
    @JoinColum(name="cid")
    一方:一方持有多方的集合
    @OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY)
    @JoinColum(name="cid")
    
多对多单向外键关联:其中一个多方持有另一个多方的集合对象
    @ManyToMany
    //维护生成中间表
    @JoinTable(name="teachers_students",JoinColums={@JoinColum(name="sid")},inverseJoinColumns={JoinColum("tid")})
    
多对多双向外键关联:双方都持有对方的集合对象,其中一方设置
    其中一方设置
    @ManyToMany(mappedBy="teachers")
    另一方
    @JoinTable(name="teachers_students",JoinColums={@JoinColum(name="sid")},inverseJoinColumns={JoinColum("tid")})