Hibernate的注解

本文详细介绍了Java Persistence API (JPA) 和 Hibernate 注解的使用方法,包括类级别和属性级别的注解,以及实体间关系映射的注解。涵盖了@Entity、@Table、@Id、@GeneratedValue等关键注解的用法。
摘要由CSDN通过智能技术生成

 

1、类级别注解

a) @Entity  @Table @Embeddable

2、属性级别注解

a) @Id @GeneratedValue     @Column

b) @Embedded  @EmbeddedId     @Transient

 

第一章:类级别注解

 

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

2、JPAhibernate的关系:什么是JAP?全称java Persistence  API JPA注解是javaee的规范和标准。JPA是标准接口,hibernate是实现,但其功能是JPA的超集。hibernate如何实现与JPA的关系?通过hibernate-annotationhibernate-entitymanagerhibernate-core三个组件实现。一般在实际开发中,优先考虑使用JPA注解,这样更有利于程序的移植和扩展。

3、Hibernate注解分类:类级别注解、属性级别注解、映射关系注解

4、@Entity

a) @entity:映射实体类

b) @entityname=”tableName”name:可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略。注意:使用@Entity时必须指定实体类的主键属性(get放上上设置)。

5、@Table

a) @Tablename=””,catalog=””,schema=””@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息。Name:可选,映射表的名称,默认表名和实体名称一致,只有在不一致的情况下才需要指定表名。Catalog-可选,表示catalog名称,默认为catalog(“”)。Schema-可选,表示schema名称,默认为schema“”)。

6、@Embeddable

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

7、@schemacatalog

a) 从实现的角度来看,各种数据库系统对CatalogSchema的支持和实现方式千差万别的。

b) 

8、

 

 

 

 

 

第二章Hibernate属性级别注解

添加方式:

1、是写在属性字段上面

2、是写在属性的get访问器的上面

 

 

l @Id

l @SequenceGenerator

l @GeneratedValue

l @Column

l @Embedded

l @EmbeddedId

l @Lob

l @Version

l @Basic

l @Transient

 

 

@Id

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

注意:如果有多个属性定义为主键属性,该实体类必须实现serializable接口。(hibernate5.2 mysql5.7 不需要实现 serializable也可以)

 

 

@GeneratedValue

@GeneratedValuestrategy=GenerationTypegenerator=””:可选,用于定义主键生成策略。

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

1、GenerationType.AUTO:根据底层数据库自动选择(默认)

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等主键生成方式

 

 

@Column

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

常用属性:

Name:可选,表示数据库表中该字段的名称,默认情况属性名称一致。

Nullable:可选,表示该字段是否允许为null,默认为true

Unique:可选,表示该字段是否是唯一标识,默认为false

Length:可选,表示该字段的大小,仅对string类型的字段有效,默认值为255。(如果是主键不能使用默认值)

Insertable:可选,表示ORM框架执行更新操作时,该字段是否应出现insert语句中,默认为true

Updateable:可选,表示在ORM框架执行更新操作时,该字段是否应该出现在update语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段。

 

 

@Embedded

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

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

 

 

@EmbeddedId

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

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

 

 

@Transient

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

 

 

第三章:关系映射级别注解

1、一对一单向外键 @OneToOne

2、一对一双向外键关联 @OneToOne(mappedBy=”xxx”)

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

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

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

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

7、多对多单向外键关联 @ManyToMany   @JoinTable

8、多对多双向外键关联 @ManyToMany(mappedBy=”xxx”)  @JoinTable

 

 

实体之间的映射关系

一对一:一个公民对应一个身份证号码。

一对多(多对一):一个公民有多个银行账号。

多对多:一个学生有多个老师,一个老师有多个学生。

 

 

 

一对一单向外键

l @OneToOnecascade=CascadeType.ALL

l @JoinColumn(name=”pid”,unique=”true”)

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

 

 

一对一双向外键

主控方的配置同一对一单向外键关联

l @OneToOnemappedBy=”card”//被控方

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

 

 

一对一双向外键联合主键

创建主键类

主键类必须实现serializable接口,重写hashCode()和equals()方法。

主键类

@Embeddable

实体类

@EmbeddedId

 

 

多对一单向外键

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

@ManyToOnecascade={CascadeType.ALL},fetch=FetchType.EAGER

@JoinColumn(name=”cid”,referencedColumnName=”CID”)

 

@JoinColumn(name = "ClassRoom_ID",referencedColumnName = "cid"),应该是这样的,后面的cid表示 ClassRoom 的成员变量cid,表示Student表参照它生成列,列名叫ClassRoom_ID。生成以后,Student表会有一个列叫ClassRoom_ID,并且是 ClassRoom 的表的id属性对应的外键

 

 

一对多单向外键

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

@OneToManycascade={CascadeType=.ALL},fetch=FetchType.LAZY

@JoinColumn(name=”cid”)

 

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

 

 

 

一对多(多对一)双向外键

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

n @ManyToOnecascade={CascadeType.ALL},fetch=FetchType.EAGER

n @JoinColumn(name=”cid”)

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

n @OneToManycascade={CascadeType.ALL},fetch=FetchType.LAZY

n @JoinColumn(name=”cid”)

 

 

 

 

 

多对多单向外键

学生和教师构成多对多的关联关系

其中一个多方持有另一个多方的集合对象(学生持有教师的集合)

创建中间表

//学生类

@ManyToMany

@JoinTable

Name=”teachers-students”,

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

inverseJoinColumns={@JoinColumnname=”tid”}

 

 

 

 

多对多双向外键

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

//教师端

@ManyToManymappedBy=”teachers”

另一方

//学生端

@ManyToMany

@JoinTable

Name=”teachers_students”,

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

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

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值