订单和订单项就是一对多的关系。一个订单有多个订单项,一个订单项属于某个订单。

订单和订单项映射后的表结构如下:

订单表结构

订单项表结构

下面就以订单和订单项为例介绍多对多映射关系的实例开发

persistence.xml配置文件

<?xml version="1.0"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <!--事务类型:本地事务(仅针对一个数据库)和全局事务(针对多个数据库);RESOURCE_LOCAL: 本地事务 --> <persistence-unit name="ljq" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> <property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="mysql"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>

Order订单类

package com.ljq.entity; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; /** * one端 * * 碰到many为末端的加载就是延迟加载,若one为末端则为立即加载,除了one-to-one。 * * @author jiqinlin * */ @Entity @Table(name = "tb_order") @SuppressWarnings("serial") public class Order implements java.io.Serializable { // String类型不能用uuid,需要人为指定 @Id @Column(length = 12) private String orderid; @Column(nullable = false) private Float amount = 0f; // @OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE}) // mappedBy="order": 指明Order类为双向关系维护端,负责外键的更新 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "order") private Set<OrderItem> items = new HashSet<OrderItem>(); public Order() { super(); } public Float getAmount() { return amount; } public void setAmount(Float amount) { this.amount = amount; } public String getOrderid() { return orderid; } public void setOrderid(String orderid) { this.orderid = orderid; } public Set<OrderItem> getItems() { return items; } public void setItems(Set<OrderItem> items) { this.items = items; } //////////////////////////////////// /** * 添加订单项 * * @param student */ public void addOrderItem(OrderItem item) { if (!this.items.contains(item)) { this.items.add(item); item.setOrder(this); } } /** * 删除订单项 * * @param student */ public void removeOrderItem(OrderItem item) { if (this.items.contains(item)) { item.setOrder(null); this.items.remove(item); } } }

OrderItem订单项类

package com.ljq.entity; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; /** * many端 * * 在one-to-many双向关联中,多的一方为关系维护端,关系维护端负责外键记录的更新 * 关系被维护端是没有权力更新外键记录的 * * @author jiqinlin * */ @Entity @Table(name = "tb_orderitem") @SuppressWarnings("serial") public class OrderItem implements java.io.Serializable { @Id @GeneratedValue private Integer id; @Column(length = 40, nullable = false) private String productName; @Column(nullable = false) private Float sellPrice = 0f; // optional=true:可选,表示此对象可以没有,可以为null;false表示必须存在 @ManyToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, optional = true) @JoinColumn(name = "order_id") private Order order; public OrderItem() { super(); } public OrderItem(String productName, Float sellPrice) { super(); this.productName = productName; this.sellPrice = sellPrice; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public Float getSellPrice() { return sellPrice; } public void setSellPrice(Float sellPrice) { this.sellPrice = sellPrice; } public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } }

OrderTest测试类

package com.ljq.test; import java.io.Serializable; import java.util.List; import java.util.Set; import java.util.UUID; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.junit.Test; import com.ljq.entity.Order; import com.ljq.entity.OrderItem; import com.sun.org.apache.xpath.internal.operations.Or; public class OrderTest { /** * 添加订单Order时同时添加两个订单项OrderItem,因为订单Order为双向关系维护者,起着主导作用 */ @Test public void save() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Order order = new Order(); order.setAmount(34f); //UUID.randomUUID().toString() order.setOrderid("xxxx"); order.addOrderItem(new OrderItem("足球",20f)); order.addOrderItem(new OrderItem("篮球",25f)); em.persist(order); em.getTransaction().commit(); em.close(); factory.close(); } /** * 删除Order对象时,会自动删除OrderItem对象(即:父对象删除时子对象跟着删除) */ @Test public void detele1(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Order order=em.getReference(Order.class, "xxxx"); em.remove(order); em.getTransaction().commit(); em.close(); factory.close(); } /** * 删除子对象时,父对象没影响 */ @Test public void detele2(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); OrderItem item=em.getReference(OrderItem.); em.remove(item); em.getTransaction().commit(); em.close(); factory.close(); } //运行结果为: //orderid:xxxx, amount:34.0 //productName:足球price:20.0 //productName:篮球price:25.0 //=============== @Test public void find1(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); List<Order> orders=em.createQuery("select o from Order o").getResultList(); for(Order order:orders){ System.out.println("orderid:"+order.getOrderid()+", "+"amount:"+order.getAmount()); Set<OrderItem> orderItems=order.getItems(); for(OrderItem item:orderItems){ System.out.println("productName:"+item.getProductName()+"price:"+item.getSellPrice()); } System.out.println("==============="); } em.close(); factory.close(); } //运行结果为 //productName:足球price:20.0 //orderid:xxxx, amount:34.0 //============ //productName:篮球price:25.0 //orderid:xxxx, amount:34.0 //============ @Test public void find2(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); List<OrderItem> items=em.createQuery("select o from OrderItem o").getResultList(); for(OrderItem item:items){ System.out.println("productName:"+item.getProductName()+"price:"+item.getSellPrice()); Order order=item.getOrder(); System.out.println("orderid:"+order.getOrderid()+", "+"amount:"+order.getAmount()); System.out.println("============"); } em.close(); factory.close(); } /** * 测试jpa环境是否搭建成功 * */ @Test public void test() { Persistence.createEntityManagerFactory("ljq"); } }

jpa一对多映射案例的更多相关文章

  1. SpringBoot Jpa入门案例

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons) 我们先来了解一下是什么是springboot jpa,springboo ...

  2. JPA入门案例详解(附源码)

    1.新建JavaEE Persistence项目

  3. JPA案例

    ORM 什么是ORM: 对象关系映射(Object Relational Mapping,简称ORM)是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的. ORM思想 主要 ...

  4. [ SSH框架 ] Hibernate框架学习之四(JPA)

    一.JPA概述以及它和Hibernate之间的关系 1.1.Hibernate 概述 JPA Java Persistence API,是EJB3规范中负责对象持久化的应用程序编程接口(ORM接口), ...

  5. JPA概述以及它和Hibernate之间的关系

    http://www.cnblogs.com/Kevin-ZhangCG/p/8996491.html 一.JPA概述以及它和Hibernate之间的关系 1.1.Hibernate 概述 JPA J ...

  6. Jpa使用详解

    目录 ORM思想 1.ORM概述 2.为什么要使用ORM 3.常见的ORM框架 JPA简介 1.JPA概述 2.JPA的优势 3.JPA与hibernate的关系 JPA入门案例 1.搭建开发环境 常 ...

  7. JPA入门及深入

    一:ORM介绍 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数 ...

  8. SpringData使用与整合

    SpringData 整合源码:链接: https://pan.baidu.com/s/1_dDEEJoqaBTfXs2ZWsvKvA 提取码: cp6s(jar包自行寻找) author:Simpl ...

  9. (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)

    (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...

随机推荐

  1. ACM Self Number

    In 1949 the Indian mathematician D.R. Kaprekar discovered a class of numbers called self-numbers. Fo ...

  2. Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》

    在之前的小案例中写过一篇使用HttpUrlConnection获取网络数据的例子.在OKhttp盛行的时代,当然要学会怎么使用它,本篇就对其基本使用做一个介绍,然后再使用它的接口回调的方式获取相同的数 ...

  3. Android图表库MPAndroidChart(一)——了解他的本质,方能得心应手

    Android图表库MPAndroidChart(一)--了解他的本质,方能得心应手 我们项目中经常会遇到一些统计图,比如折线图,线形图等,在一些运动健康类的App中尤其的常见,这画起来要命,我以前就 ...

  4. Linux 高性能服务器编程——多进程编程

    问题聚焦:     进程是Linux操作系统环境的基础.     本篇讨论以下几个内容,同时也是面试经常被问到的一些问题:     1 复制进程映像的fork系统调用和替换进程映像的exec系列系统调 ...

  5. Cocoa中层(layer)坐标系的极简理解

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Cocoa层的坐标系一直理解的不清晰,现在把它整理总结一下: ...

  6. Android文件(File)操作

    Android 使用与其他平台上基于磁盘的文件系统类似的文件系统. 本文讲述如何使用 Android 文件系统通过 File API 读取和写入文件. File 对象适合按照从开始到结束的顺序不跳过地 ...

  7. android studio的快捷键设置的和eclispe一样

    最近安装了android studio,但是习惯了使用eclispe的快捷键,所以我也把android studio的快捷键设置的和eclipse一样. 具体如下: 1.快捷键 Android Stu ...

  8. Linux内核分配内存的方式

    page = alloc_pages(GFP_KERNEL, get_order(1234));分配失败返回NULLGFP_KERNEL  ---> 分配标志,当没有足够内存分配时,睡眠阻塞,直 ...

  9. [学习笔记]java基础Java8SE开发环境搭建、第一个Java Hello World、Java程序的编译与执行

    本文作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/25745945 内容简介: ------------ ...

  10. JDK 7中的文件操作的新特性

    文件系统综述 一个文件系统在某种媒介(通常是一个或多个硬盘)上存储和组织文件.如今的大多数文件系统都是以树状结构来存储文件.在树的顶端是一个或多个根节点,在根节点一下,是文件和目录(在Windows系 ...