JPA一对多和多对一关系

1-m:多的一方为关系维护端,关系维护端负责外键纪录的更新,关系被维护端没有权力更新外键纪录.

维护端注解

Java代码  

  1. @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH,
  2. CascadeType.MERGE, CascadeType.REMOVE },
  3. fetch = FetchType.EAGER,
  4. mappedBy = "order")

被维护端注解

Java代码  

  1. @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
  2. @JoinColumn(name = "order_id")

对于一对多和多对一关系的现实中的例子是,网上购物时的订单和订单项。一个订单有多个订单项。多个订单项属于一个订单。

订单实体类:

Java代码  

  1. package com.taoistwar.jpa.entity.onetomany;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. import javax.persistence.CascadeType;
  5. import javax.persistence.Entity;
  6. import javax.persistence.FetchType;
  7. import javax.persistence.GeneratedValue;
  8. import javax.persistence.GenerationType;
  9. import javax.persistence.Id;
  10. import javax.persistence.OneToMany;
  11. import javax.persistence.Table;
  12. @Entity
  13. @Table(name = "order_info")
  14. public class OrderInfo {
  15. private Integer id;
  16. private String name;
  17. private Set<OrderItem> items = new HashSet<OrderItem>();
  18. @Id
  19. @GeneratedValue(strategy = GenerationType.AUTO)
  20. public Integer getId() {
  21. return id;
  22. }
  23. public void setId(Integer id) {
  24. this.id = id;
  25. }
  26. public String getName() {
  27. return name;
  28. }
  29. public void setName(String name) {
  30. this.name = name;
  31. }
  32. @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH,
  33. CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER,
  34. mappedBy = "order")
  35. public Set<OrderItem> getItems() {
  36. return items;
  37. }
  38. public void setItems(Set<OrderItem> items) {
  39. this.items = items;
  40. }
  41. public void addOrderItem(OrderItem orderItem) {
  42. orderItem.setOrder(this);
  43. this.items.add(orderItem);
  44. }
  45. }

重点在于:

Java代码  

  1. @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH,
  2. CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER,
  3. mappedBy = "order")
  4. ublic Set<OrderItem> getItems() {
  5. return items;

 订单项实体类:

Java代码  

  1. package com.taoistwar.jpa.entity.onetomany;
  2. import javax.persistence.CascadeType;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.GenerationType;
  7. import javax.persistence.Id;
  8. import javax.persistence.JoinColumn;
  9. import javax.persistence.ManyToOne;
  10. import javax.persistence.Table;
  11. @Entity
  12. @Table(name = "order_item")
  13. public class OrderItem {
  14. private Integer Id;
  15. private String name;
  16. private OrderInfo order;
  17. @Id
  18. @GeneratedValue(strategy = GenerationType.AUTO)
  19. public Integer getId() {
  20. return Id;
  21. }
  22. public void setId(Integer id) {
  23. Id = id;
  24. }
  25. @Column(length = 20, nullable = true)
  26. public String getName() {
  27. return name;
  28. }
  29. public void setName(String name) {
  30. this.name = name;
  31. }
  32. @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
  33. @JoinColumn(name = "order_id")
  34. public OrderInfo getOrder() {
  35. return order;
  36. }
  37. public void setOrder(OrderInfo order) {
  38. this.order = order;
  39. }
  40. @Override
  41. public int hashCode() {
  42. final int prime = 31;
  43. int result = 1;
  44. result = prime * result + ((Id == null) ? 0 : Id.hashCode());
  45. return result;
  46. }
  47. @Override
  48. public boolean equals(Object obj) {
  49. if (this == obj)
  50. return true;
  51. if (obj == null)
  52. return false;
  53. if (getClass() != obj.getClass())
  54. return false;
  55. OrderItem other = (OrderItem) obj;
  56. if (Id == null) {
  57. if (other.Id != null)
  58. return false;
  59. } else if (!Id.equals(other.Id))
  60. return false;
  61. return true;
  62. }
  63. }

重点在于:

Java代码  

  1. @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
  2. @JoinColumn(name = "order_id")
  3. public OrderInfo getOrder() {
  4. return order;
  5. }

测试类:

Java代码  

  1. package com.taoistwar.jpa.entity.onetomany;
  2. import javax.persistence.EntityManager;
  3. import javax.persistence.EntityManagerFactory;
  4. import javax.persistence.Persistence;
  5. import org.junit.Test;
  6. public class OneToMany {
  7. @Test
  8. public void save() {
  9. EntityManagerFactory emf = Persistence
  10. .createEntityManagerFactory("JPAPU");
  11. EntityManager em = emf.createEntityManager();
  12. em.getTransaction().begin();
  13. OrderInfo o = new OrderInfo();
  14. o.setName("订单一");
  15. OrderItem oi1 = new OrderItem();
  16. oi1.setName("产品一");
  17. o.addOrderItem(oi1);
  18. OrderItem oi2 = new OrderItem();
  19. oi2.setName("产品一");
  20. o.addOrderItem(oi2);
  21. OrderItem oi3 = new OrderItem();
  22. oi3.setName("产品一");
  23. o.addOrderItem(oi3);
  24. OrderItem oi4 = new OrderItem();
  25. oi4.setName("产品一");
  26. o.addOrderItem(oi4);
  27. em.persist(o);
  28. // UUID.randomUUID().toString();
  29. em.getTransaction().commit();
  30. emf.close();
  31. }
  32. }
  • JPA.zip (5.7 MB)
  • 下载次数: 537

JPA一对多和多对一关系

时间: 2024-12-14 17:34:44

JPA一对多和多对一关系的相关文章

Hibernate中一对多和多对一关系

1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdeptarment())不需要 从部门下的人员信息时,就配置成单向 多对一 使用部门时如果只需要获取部门下人员信息(deptartmanet.getusers())不需要 从人员获取部门信息时,就配置成单向 一对多 既要获取部门下人员 deptartmanet.getusers()又要从人员获取部门信息

Django 一对多,多对多关系解析

[转]Django 一对多,多对多关系解析 Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 : 一对一: OneToOneField 多对一: ForeignKey 多对多: ManyToManyField 上边的描述太过数据而缺乏人性化,我们来更人性化一些: 多个属于一个,即 belong to :  ForeignKey,多个属于一个 一个有一个,即 has one: OneToOneField 一个有很多个,即 has many:  lots of A b

EF里一对一、一对多、多对多关系的配置和级联删除

      参考 EF里一对一.一对多.多对多关系的配置和级联删除 EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

数据库一对一、一对多、多对多关系

数据库一对一.一对多.多对多关系 一.首先给出三种关系的实例 一对一关系实例 ? 一个人对应一张身份证,一张身份证对应一个人 一对多关系实例 ? 一个公司的部门拥有多个职员,一个职员只能够属于某个部门 多对多实例 ? 一本图示可以拥有多个作者,一个作者可以写很多本书. 一对一关系 一对多,是最常见的一种设计.就是 A 表的一条记录,对应 B 表的多条记录,且 A 的主键作为 B 表的外键.这主要看以哪张表为中心. 优点 便于管理.可提高一定的查询速度 减轻 CPU 的 IO 读写,提高存取效率.

数据库中根据数据一对一,一对多,多对多关系设计

做一个项目,必然是少不了数据库设计的!在学习阶段,基本都是单表.然而在实际开发过程中,一对多,多对多的表处处都是!简单整理一下,一对多,多对多表如何设计整理一下思路: 数据库实体间有三种对应关系:一对一,一对多,多对多. 一对一关系示例: 一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号. 一对多关系示例: 一个学生只属于一个班,但是一个班级有多名学生. 多对多关系示例: 一个学生可以选择多门课,一门课也有多名学生. 1.一对多关系处理: 通过学生和班级问题了解一对多: 设计数据库表

Hibernate自身一对多和多对多关系映射

一对多关系映射大家都明白,关系双方都一个含有对方多个引用,但自身一对多很多同学都不明白什么意思,那么首先我就说明一下什么是自身一对多,其实也很好理解,自身一对多就是自身含有本身的多个引用,例如新闻类别,新闻包含体育新闻和政治新闻,体育新闻内有含有足球新闻和篮球新闻,其实他们都属于新闻,只是名字不同而已,下面我们就以新闻类别为例来具体说明一下: 首先我们来看一下新闻类别的类图: 类图:category 从上面的图我们可以看出:每一个新闻类别都有一个父类别和一个孩子类别的set集合,这个父类别和孩子

2.2、Hibernate用注解方式实现一对多、多对多关系

一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bean4 包,往包里面添加两个含有注解的类: a).DeptBean2类: 1 package com.st.bean4; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 7 import javax.persistence.Colum

数据库一对一,一对多,多对多关系

关联映射:一对多/多对一 存在最普遍的映射关系,简单来讲就如球员与球队的关系: 一对多:从球队角度来说一个球队拥有多个球员 即为一对多 多对一:从球员角度来说多个球员属于一个球队 即为多对一 数据表间一对多关系如下图: 关联映射:一对一 一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队. 数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联.图示如下: 一对一外键关联: 一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关

对象设计时如何选择“一对多”与“多对一”关系

做面向对象设计的时候,我们常常面对这样一个问题.当对象之间存在一对多关系的时候,在物理设计的时候应该选择一对多关系还是多对一关系?举例来说,假设有一个订单对象,每个订单对象对应多个订单条目.这个时候我们在设计的时候有两中选择,一种是在订单对象中加入一个订单条目集合,另外一种方法是在订单条目中引用订单对象.分别对应以下两种设计.                       最简单一种方法是同时保留两种关系,也就是既在订单对象中保留订单条目集合,也在订单条目上引用订单对象.这也是很多根据数据库生成对