1. @OneToMany

@OneToMany 是属性或方法级别的注解,用于定义源实体目标实体是一对多的关系。

参数 类型 描述
targetEntity Class 源实体关联的目标实体类型,默认是该成员属性对应的集合类型的泛型的参数化类型。
mappedBy String 用在双向关联中。如果关系是双向的,则需定义此参数(与 @JoinColumn 互斥,如果标注了 @JoinColumn 注解,不需要再定义此参数)。
cascade CascadeType[] 定义源实体和关联的目标实体间的级联关系。当对源实体进行操作时,是否对关联的目标实体也做相同的操作。默认没有级联操作。该参数的可选值有:
CascadeType.PERSIST(级联新建)
CascadeType.REMOVE(级联删除)
CascadeType.REFRESH(级联刷新)
CascadeType.MERGE(级联更新)
CascadeType.ALL(包含以上四项)
fetch FetchType 定义关联的目标实体的数据的加载方式。
可选值:
FetchType.LAZY(延迟加载,默认)
FetchType.EAGER(立即加载)
延迟加载:只有在第一次访问源实体关联的目标实体的时候才去加载。
立即加载:在加载源实体数据的时候同时去加载好关联的目标实体的数据。
orphanRemoval boolean 源实体关联的目标实体被断开(如给该属性赋予另外一个实例,或该属性的值被设为 null。被断开的实例称为孤值,因为已经找不到任何一个实例与之发生关联)时,是否自动删除断开的实例(在数据库中表现为删除表示该实例的行记录),默认为 false。
可参考:orphanRemoval 与 CascadeType.REMOVE 的区别

1.1 一对多外键关联

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Entity(name = "user")
public class User implements Serializable {
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Address> addresses;
// getters and setters
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Entity(name = "address")
public class Address implements Serializable {
@Id
@GeneratedValue
private Long id;
private String name;
private String province;
private String city;
private String area;
private String detail;
// getters and setters
}

产生的 DDL 语句(MySQL):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`password` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `address` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`area` varchar(255) DEFAULT NULL,
`city` varchar(255) DEFAULT NULL,
`detail` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`province` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_addresses` (
`user_id` bigint(20) NOT NULL,
`addresses_id` bigint(20) NOT NULL,
PRIMARY KEY (`user_id`,`addresses_id`),
UNIQUE KEY `UK_i5lp1fvgfvsplfqwu4ovwpnxs` (`addresses_id`),
CONSTRAINT `FKfm6x520mag23hvgr1oshaut8b` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
CONSTRAINT `FKth1icmttmhhorb9wiarm73i06` FOREIGN KEY (`addresses_id`) REFERENCES `address` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Hibernate @OneToMany 默认会产生一张中间表,如上例的 user_addresses 表。为了避免这种情况,你可以在一的一方使用 @JoinColumn 注解:

1
2
3
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "user_id")
private Set<Address> addresses;

产生的 DDL 语句(MySQL):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`password` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `address` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`area` varchar(255) DEFAULT NULL,
`city` varchar(255) DEFAULT NULL,
`detail` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`province` varchar(255) DEFAULT NULL,
`user_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FKda8tuywtf0gb6sedwk7la1pgi` (`user_id`),
CONSTRAINT `FKda8tuywtf0gb6sedwk7la1pgi` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这样一来,多的一方通过外键直接与一的一方发生关联,不需要中间表。

2. @ManyToOne

@ManyToOne 是属性或方法级别的注解,用于定义源实体目标实体是多对一的关系。

参数 类型 描述
targetEntity Class 源实体关联的目标实体类型,默认是该成员属性对应的类型,因此该参数通常可以缺省。
cascade CascadeType[] 定义源实体和关联的目标实体间的级联关系。当对源实体进行操作时,是否对关联的目标实体也做相同的操作。默认没有级联操作。该参数的可选值有:
CascadeType.PERSIST(级联新建)
CascadeType.REMOVE(级联删除)
CascadeType.REFRESH(级联刷新)
CascadeType.MERGE(级联更新)
CascadeType.ALL(包含以上四项)
fetch FetchType 定义关联的目标实体的数据的加载方式。
可选值:
FetchType.LAZY(延迟加载)
FetchType.EAGER(立即加载,默认)
延迟加载:只有在第一次访问源实体关联的目标实体的时候才去加载。
立即加载:在加载源实体数据的时候同时去加载好关联的目标实体的数据。
optional boolean 源实体关联的目标实体是否允许为 null,默认为 true。

2.1 多对一外键关联

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity(name = "user")
public class User implements Serializable {
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
// getters and setters
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Entity(name = "address")
public class Address implements Serializable {
@Id
@GeneratedValue
private Long id;
private String name;
private String province;
private String city;
private String area;
private String detail;
@ManyToOne(optional = false)
private User user;
// getters and setters
}

产生的 DDL 语句(MySQL):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`password` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `address` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`area` varchar(255) DEFAULT NULL,
`city` varchar(255) DEFAULT NULL,
`detail` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`province` varchar(255) DEFAULT NULL,
`user_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `FKda8tuywtf0gb6sedwk7la1pgi` (`user_id`),
CONSTRAINT `FKda8tuywtf0gb6sedwk7la1pgi` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3. @OneToMany & @ManyToOne

一对多 & 多对一双向外键关联示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Entity(name = "user")
public class User implements Serializable {
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "user_id")
private Set<Address> addresses;
// getters and setters
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Entity(name = "address")
public class Address implements Serializable {
@Id
@GeneratedValue
private Long id;
private String name;
private String province;
private String city;
private String area;
private String detail;
@ManyToOne(optional = false)
private User user;
// getters and setters
}

产生的 DDL 语句(MySQL):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`password` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `address` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`area` varchar(255) DEFAULT NULL,
`city` varchar(255) DEFAULT NULL,
`detail` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`province` varchar(255) DEFAULT NULL,
`user_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `FKda8tuywtf0gb6sedwk7la1pgi` (`user_id`),
CONSTRAINT `FKda8tuywtf0gb6sedwk7la1pgi` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

原文地址:http://fanlychie.github.io/post/jpa-one-to-many-many-to-one-annotation.html

JPA 一对多、多对一注解的更多相关文章

  1. PringData JPA一对多多对一多对多关联

    一.一对多.多对一 1.Country实体类 2.City实体类 3.CountryDao层 4.CityDao层 5.Controller package com.zn.controller; im ...

  2. SpringData JPA一对多多对一多对多关联

    一.一对多.多对一 1.Country实体类 2.City实体类 3.CountryDao层 4.CityDao层 5.Controller package com.zn.controller; im ...

  3. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  4. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  5. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  6. SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份

    SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...

  7. 使用NHibernate(7)-- 一对一 && 一对多 && 多对多

    1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...

  8. JPA一对多关联

    关于JPA一对多关联这里使用Order与OrderItem来模拟.一个Order可以关联多个OrderItem,而一个OrderItem只能关联一个Order.Order与OrderItem是一对多的 ...

  9. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

随机推荐

  1. php 单向散列加密

    1.加密文件 <?php //sha1_en.php header("content-type:text/html;charset=utf-8"); $str = " ...

  2. Excel柱状图折线图组合怎么做 Excel百分比趋势图制作教程

    Excel柱状图折线图组合怎么做 Excel百分比趋势图制作教程 用excel作图时候经常会碰到做柱状图和折线图组合,这样的图一般难在折线图的数据很小,是百分比趋势图,所以经常相对前面主数据太小了,在 ...

  3. Win32 Console Application、Win32 Application、MFC三者之间的联系和区别

    转自:http://blog.csdn.net/c_base_jin/article/details/52304845 在windows编程中,我们或多或少都听说这三个名称,分别是Win32 Cons ...

  4. css中用一张背景图做页面的技术有什么优势?

    css中用一张背景图做页面的技术有什么优势? 简单介绍一下 CSS Sprites 的优点: 当用户往U盘中拷200张图片,会等很久.但是如果弄成一个文件,再拷贝就会快很多. CSS Sprites ...

  5. python第二天 : 计算机基础(二)

    目录 1.什么是编程 2.操作系统有什么用? 3.计算机由哪三大部分组成? 4.简述操作系统和应用程序的启动流程? 5.编程语言的分类有哪些?并评估各个分类的优缺点. 1).机器语言 2).汇编语言 ...

  6. js流星雨效果

    css部分 div { border: 0px solid #fff; border-width: 0px 90px 2px 90px; border-color: transparent trans ...

  7. R语言与显著性检验学习笔记

    R语言与显著性检验学习笔记 一.何为显著性检验 显著性检验的思想十分的简单,就是认为小概率事件不可能发生.虽然概率论中我们一直强调小概率事件必然发生,但显著性检验还是相信了小概率事件在我做的这一次检验 ...

  8. SPSS分析技术:二阶聚类分析;为什么出现大学生“裸贷”业务,因为放贷者知道贷款者还不起

    SPSS分析技术:二阶聚类分析:为什么出现大学生"裸贷"业务,因为放贷者知道贷款者还不起 今天将介绍一种智能聚类法,二阶聚类法,在开始介绍之前,先解答很多人在后台提出的一个疑问:那 ...

  9. django2.0基础

    一.安装与项目的创建 1.安装 pip install django 2.查看版本 python -m django --version 3.创建项目 django-admin startprojec ...

  10. jq方法的注意点

    当jq方法里面引用的ajax方法和其它方法时,就需要把ajax改为同步,通过ajax方法返回值来判断下一步执行那个方法,你不做判断,浏览器编译执行的时候不会不会按你想的从上之下执行下来. 当安卓手机跟 ...