JPA关联注解

关联注解

示例表:

客户表

CREATE TABLE customer {

    id          int(20) NOT NULL auto_increment,

    name        varchar(100),

    address_id  int(20),

    PRIMARY KEY (id) 

}

 

地址表

 

 

 

 

CREATE TABLE address {

    id          int(20) NOT NULL auto_increment,

    city        varchar(100),

    detail     varchar(100),

    PRIMARY KEY (id) 

}

 

 

 

 

 

 


 

关联指定列@JoinColumn

注解表中保存表与表之间关系的字段,它要标注在实体上。

属性:

name 标识表中所对应的字段的名称

unique 表示字段是否为唯一表示,默认为false

nullable 表示该字段是否可以为NULL

insertable 表示在使用insert脚本插入数据时,是否需要插入该字段

updatable 表示在使用update脚本更新时,是否需要更新该字段

columnDefinition 表示创建表时,该字段创建的sql语句。一般用于通过Entity生成表定义时使用

table 表示当映射多个表时,石碇表的表中的字段。默认为主表的表名。

referencedCoumnName 标注的是所关联表中的字段名。默认是所关联表的逐渐字段名

一对多@OneToOne

属性:

targetEntity 表示默认关联的实体类型,默认为当前标注的实体类。所以一般该熟悉可省略

cascade 表示与此实体关联的实体的基联样式类型。默认为不做任何操作

fetch 表示该实体的加载方式。默认为即时加载eager,也可以是延时加载lazy

optional 表示关联的实体是否能够存在NULL值。默认为true,当为false时要配合使用@JoinColumn注解

mappyBy 双向关联属性,标注在不保存关系的实体中

 

例:

 

 

由于Customer的address_id字段是与address表的主键id关联,所以Customer实体里的JoinColumn注解里就不需要指定referencedColumnName="id"

 

双向关联

以上的一对一关联只是单向关联,即只能通过客户对象得到地址对象,不能通过地址对象得到客户对象。

那么要想通过地址对象得到客户对象则要在地址实体类中增加对客户实体对象的引用。

Address里要加一个Customer对象

 

 

一对多@OneToMany

@OneToMany的属性和@OneToOne的一样。

唯一要注意一点的是,一对多的实体集合保存在集合类中,所以

要么指定集合的类型如:private List<Address> addresses

要么指定targetEneity属性

 

多对一@ManyToOne

@ManyToOne属性和@OneToOne一样

 

例:

在此为了示例的需要address表里添加标识客户的字段customer_id,customer表中去掉address_id字段

 

单向关联:

 

 

双向关联:

 

mappedBy的使用

若为双向关联,则在保存实体关系的实体中(Address)要配合使用@JoinColumn注释,在没有保存实体关系的实体中要用mappedBy属性明确所关联的实体

若为单向关联,则在保存实体关系的实体中要配合使用@JoinColumn注释;没有保存实体关系的实体中也要使用。

 

多对多@ManyToMany

多对多的映射策略是表关联@JoinTable

@JoinTable

属性:

name 连接两个表的表名,如不指定则为“表名1” + “_” + "表名2"的规则命名

catablog和schema 表示实体指定的目录名或数据库名,这根据不同的数据库类型有所不同

joinColumns 表示在保存关系中的表中,所保存关联关系的外建字段,并配合@JoinColumn使用

inverseJoinColumns 和joinColumns一样,表示另一个外建字段

uniqueConstraints 表示该实体所关联的唯一约束条件,一个实体可以又多个唯一约束条件,默认没有约束条件

 

为配合示例,在初始表结构上去掉customer表中的address_id字段,添加关系表customer_address

CREATE TABLE customer_address {

    customer_id          int(20),

    address_id          int(20)

}

 

单向关联:

 

双向:

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值