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

维护端注解

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

被维护端注解

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

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

订单实体类:

  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. }

重点在于:

  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;

 订单项实体类:

  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. }

重点在于:

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

测试类:

  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一对多和多对一关系的更多相关文章

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

    本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...

  2. Hibernate中一对多和多对一关系

    1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdept ...

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

    [转]Django 一对多,多对多关系解析   Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 :        一对一: OneToOneField         ...

  4. EF——一对一、一对多、多对多关系的配置和级联删除 04(转)

    EF里一对一.一对多.多对多关系的配置和级联删除   本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个P ...

  5. Java基础-SSM之mybatis一对多和多对一关系映射

    Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建customers表: ...

  6. [Z]Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

  7. Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

  8. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

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

    一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...

随机推荐

  1. .htaccess 文件的使用

    用于服务器对文件夹的控制 官方解释为 :分布式配置文件 ,提供了针对目录改变配置的方法; 项目可以有多个这样的配置文件,子目录文件会覆盖父目录的配置 在apache(这里泛指服务器)中,/conf/v ...

  2. 正确理解 AsyncTask,Looper,Handler三者之间的关系(基于android 4.0)

    Looper 和Handler 是理解好AsyncTask的一个基础,我们可以先从这里开始,先给出一个主线程和子线程互相通信的例子. package com.example.loopertest; i ...

  3. ADB Offline

    终极可能原因:版本太旧 http://stackoverflow.com/questions/14993855/android-adb-device-offline-cant-issue-comman ...

  4. Symfony2学习笔记之表单

    对于一个Web开发者来说,处理HTML表单是一个最为普通又具挑战的任务.Symfony2集成了一个Form组件,让处理表单变的容易起来.在这一节里,我们将从基础开始创建一个复杂的表单,学习表单类库中最 ...

  5. 关于asp.net中页面事件加载的先后顺序

    一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件 ...

  6. ArcEngine下投影坐标和经纬度坐标的相互转换

    jojojojo2002 原文 ArcEngine下投影坐标和经纬度坐标的相互转换 投影转经纬度 private IPoint PRJtoGCS( double x, double y) { IPoi ...

  7. PHP.ini 配置文件解析

    [PHP] ;;;;;;;;;;;;;;;;;;;; About php.ini   ;;;;;;;;;;;;;;;;;;;;; PHP's initialization file, generall ...

  8. leetcode:Longest Palindromic Substring(求最大的回文字符串)

    Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...

  9. Struts2注解 特别注意

    1 Struts2注解的作用 使用注解可以用来替换struts.xml配置文件!!! 2 导包 必须导入struts2-convention-plugin-2.3.15.jar包,它在struts2安 ...

  10. JavaEE5 Tutorial_Jsp,EL

      Jsp的各种元素在转化为servlet时处理是不一样的:指令,控制web容器如何处理页面脚本,被插入到生成的servlet里EL表达式,作为参数传递到解析器get/set Property,变成方 ...