关联注解
示例表:
客户表
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)
}
单向关联:
双向: