@OneToMany、@ManyToOne级联配置
注解讲解
@OneToMany(fetch=FetchType,cascade=CascadeType)
可选
@OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段.
fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存
cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除
例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除
示例:
@OneTyMany(cascade=ALL)
public List getOrders() {
return orders;
}@ManyToOne(fetch=FetchType,cascade=CascadeType)
可选
@ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键
optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true
fetch:表示抓取策略,默认为FetchType.EAGER
cascade:表示默认的级联操作策略,可以指定为ALL、PERSIST、MERGE、REFRESH和REMOVE中的若干组合,默认为无级联操作
targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity.
示例:
@JoinColumn
可选
@JoinColumn和@Column类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个@ManyToOne的字段.
name:该字段的名称.由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定.
例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键,
其默认的名称为实体User的名称+下划线+实体User的主键名称
示例:见@ManyToOne
@OneToMany和@ManyToOne单向关联配置
@ManyToOne单向关联配置
Order实体类
User实体类
dao
测试
说明:
单向关联的一方,必须配置其JoinColumn,指定关联字段,注意延迟加载和立即抓取策略的使用方式,代码里已经注释,
注意其实体类名不能与Mysql关键字冲突等问题MySQL server version for the right syntax to use near
@OneToMany单向关联配置
相关的配置还是上面的实体类,下面做了如下的修改
User实体类
Order实体类
dao 参加上面
测试类
说明:
单向关联的一方,必须配置其JoinColumn,指定关联字段,注意延迟加载和立即抓取策略的使用方式,代码里已经注释,
注意其实体类名不能与Mysql关键字冲突等问题MySQL server version for the right syntax to use near,
注意级联保存的使用方式,CascadeType.ALL,注意抓取策略的实现方式FetchType.EAGER、FetchType.Lazy
@OneToMany和@ManyToOne双向关联配置
oneToMany配置方
manyToOne配置方
说明:
双向配置关联:@OneToMany一方配置相对简单,不需要配置关联字段,@manyToOne一方配置除了基本配置外,需要配置关联字段映射。
orphanRemoval = true:可以参考 更新的同时删除多的一方的旧数据
级联清空关联关系操作如下:
@OneToMany、@ManyToOne做双向关联时,如何避免产生中间表自动生成
使用JPA的时候,如果A B两个实体间是一对多,多对一的关系双向配置时,如果不在@OneToMany里加入mappedBy属性会导致自动生成一个多余的中间表,上面的双向关联配置是最佳配置
在进行双向一对多的关联关系时,建议使用多的一方来维护关联关系,而1的一方不维护关联关系,这样会有效的减少sql语句
注意:若在一的一端@oneToMany 中使用mapperBy属性,则@oneToMany端就不能在使用@JoinColumn(name="CUSTOMER_ID")属性进行级联保存如下示例:
Last updated
Was this helpful?