JPA一对多和多对一关系
1-m:多的一方为关系维护端,关系维护端负责外键纪录的更新,关系被维护端没有权力更新外键纪录.
维护端注解
- @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH,
- CascadeType.MERGE, CascadeType.REMOVE },
- fetch = FetchType.EAGER,
- mappedBy = "order")
被维护端注解
- @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
- @JoinColumn(name = "order_id")
对于一对多和多对一关系的现实中的例子是,网上购物时的订单和订单项。一个订单有多个订单项。多个订单项属于一个订单。
订单实体类:
- package com.taoistwar.jpa.entity.onetomany;
- import java.util.HashSet;
- import java.util.Set;
- import javax.persistence.CascadeType;
- import javax.persistence.Entity;
- import javax.persistence.FetchType;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- import javax.persistence.OneToMany;
- import javax.persistence.Table;
- @Entity
- @Table(name = "order_info")
- public class OrderInfo {
- private Integer id;
- private String name;
- private Set<OrderItem> items = new HashSet<OrderItem>();
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH,
- CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER,
- mappedBy = "order")
- public Set<OrderItem> getItems() {
- return items;
- }
- public void setItems(Set<OrderItem> items) {
- this.items = items;
- }
- public void addOrderItem(OrderItem orderItem) {
- orderItem.setOrder(this);
- this.items.add(orderItem);
- }
- }
重点在于:
- @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH,
- CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER,
- mappedBy = "order")
- ublic Set<OrderItem> getItems() {
- return items;
订单项实体类:
- package com.taoistwar.jpa.entity.onetomany;
- import javax.persistence.CascadeType;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- import javax.persistence.JoinColumn;
- import javax.persistence.ManyToOne;
- import javax.persistence.Table;
- @Entity
- @Table(name = "order_item")
- public class OrderItem {
- private Integer Id;
- private String name;
- private OrderInfo order;
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- public Integer getId() {
- return Id;
- }
- public void setId(Integer id) {
- Id = id;
- }
- @Column(length = 20, nullable = true)
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
- @JoinColumn(name = "order_id")
- public OrderInfo getOrder() {
- return order;
- }
- public void setOrder(OrderInfo order) {
- this.order = order;
- }
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((Id == null) ? 0 : Id.hashCode());
- return result;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- OrderItem other = (OrderItem) obj;
- if (Id == null) {
- if (other.Id != null)
- return false;
- } else if (!Id.equals(other.Id))
- return false;
- return true;
- }
- }
重点在于:
- @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
- @JoinColumn(name = "order_id")
- public OrderInfo getOrder() {
- return order;
- }
测试类:
- package com.taoistwar.jpa.entity.onetomany;
- import javax.persistence.EntityManager;
- import javax.persistence.EntityManagerFactory;
- import javax.persistence.Persistence;
- import org.junit.Test;
- public class OneToMany {
- @Test
- public void save() {
- EntityManagerFactory emf = Persistence
- .createEntityManagerFactory("JPAPU");
- EntityManager em = emf.createEntityManager();
- em.getTransaction().begin();
- OrderInfo o = new OrderInfo();
- o.setName("订单一");
- OrderItem oi1 = new OrderItem();
- oi1.setName("产品一");
- o.addOrderItem(oi1);
- OrderItem oi2 = new OrderItem();
- oi2.setName("产品一");
- o.addOrderItem(oi2);
- OrderItem oi3 = new OrderItem();
- oi3.setName("产品一");
- o.addOrderItem(oi3);
- OrderItem oi4 = new OrderItem();
- oi4.setName("产品一");
- o.addOrderItem(oi4);
- em.persist(o);
- // UUID.randomUUID().toString();
- em.getTransaction().commit();
- emf.close();
- }
- }
- JPA.zip (5.7 MB)
- 下载次数: 537
JPA一对多和多对一关系的更多相关文章
- EF里一对一、一对多、多对多关系的配置和级联删除
本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...
- Hibernate中一对多和多对一关系
1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdept ...
- Django 一对多,多对多关系解析
[转]Django 一对多,多对多关系解析 Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 : 一对一: OneToOneField ...
- EF——一对一、一对多、多对多关系的配置和级联删除 04(转)
EF里一对一.一对多.多对多关系的配置和级联删除 本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个P ...
- Java基础-SSM之mybatis一对多和多对一关系映射
Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建customers表: ...
- [Z]Spring Data JPA 之 一对一,一对多,多对多 关系映射
一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...
- Spring Data JPA 之 一对一,一对多,多对多 关系映射
一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...
- Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!
前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...
- 2.2、Hibernate用注解方式实现一对多、多对多关系
一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...
随机推荐
- github 开源项目
项目地址: https://github.com/Trinea/android-open-project
- 关于“怎么比较两个SQL查询语句产生的结果集是否相同”搜集到的一些资料
一. 如果你这两个结果集都没有close,可以这样: rs.last(); rs2.last(); if (rs.getRow() != rs2.getRow()) { //记录数不等,即结果不等 } ...
- hdu 4301(基本dp)
题意:就是给你一块2*n的巧克力,让你把它分成x块,并且每一个单位的巧克力各不相同,问有多少种分法? 分析:用dp[i][j][k],表示到巧克力的第二列时,巧克力被分成了j快,k用来表示第i列上下两 ...
- C#操作Excel,对Sheet插入次序的控制 (有待完善)
C#对Excel文件的操作,插入工作表(Worksheet)的方法是 Workbook.Worksheets.Add().通常情况下,我们在EXCEL的工作薄中,使用菜单操作:插入一个新的工作表,那么 ...
- python代码编程规范
一.内容格式 1.注释部分:模块名及简介(一般用一行写完),模块描述(包含各类方法),其它描述(注意点,功能,示例等,可以分多段) 2.导入模块:Import XXX 3.全局变量定义:wantobj ...
- SQL查询数据库信息, 数据库表名, 数据库表信息
SQL查询数据库信息, 数据库表名, 数据库表信息 ---------------------------------------------- -- 以下例子, 在sql_server 中可以直接运 ...
- Chapter9:顺序容器
现代C++程序应该使用标准库容器,而不是更原始的数据结构,例如内置数组. 新标准库容器的性能几乎肯定与最精心优化过的同类数据结构一样好. 当我们用一个对象来初始化容器时,或将一个对象插入到容器中时,实 ...
- 开扒php内核函数,第一篇 bin2hex
这段时间真的比较有时间,所以自己用c写一下bin2hex啦 写个php的人都知道,这是个比较熟悉的函数吧,没有什么高深,只是把输入的东西以16进制输出吧了 先分析一下,这个函数要怎么写吧,他会有一定的 ...
- EditText的几个小点
1. EditText 由 TextView 继承而来 2. android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要的作用.这也大大的方便的操作.有时需要虚拟键盘 ...
- 写好Hive 程序的五个提示
转自http://www.alidata.org/archives/622 使用Hive可以高效而又快速地编写复杂的MapReduce查询逻辑.但是某些情况下,因为不熟悉数据特性,或没有遵循Hive的 ...