@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?