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

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

订单表结构

订单项表结构

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

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. Python3 数据结构

    列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能. 以下是 Python 中列表的方法: 方法 描述 list.append(x ...

  2. linux2.6.37内核接两个硬盘导致读写效率变低的问题

    一.问题分析: 通过跟踪定位write系统调用的实现发现,在每次调用a_ops->write_end之后,都会去调用balance_dirty_pages_ratelimited,该函数负责检查 ...

  3. Linux基础指令

    Linux基础指令 只写了最简单的一些文件操作,基本没有带参数 查看当前目录 pwd 跳转到某路径 cd 查看当前目录下的文件 ls ls -l // -l 查看详细信息 打开当前所在文件夹 open ...

  4. Android样式(style)和主题(theme)

    样式和主题 样式是指为 View 或窗口指定外观和格式的属性集合.样式可以指定高度.填充.字体颜色.字号.背景色等许多属性. 样式是在与指定布局的 XML 不同的 XML 资源中进行定义. Andro ...

  5. 使用spark ml pipeline进行机器学习

    一.关于spark ml pipeline与机器学习 一个典型的机器学习构建包含若干个过程 1.源数据ETL 2.数据预处理 3.特征选取 4.模型训练与验证 以上四个步骤可以抽象为一个包括多个步骤的 ...

  6. Findbugs异常总汇

    FindBugs是基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug,主要检查bytecode中的bug patterns,如NullPoint空指针检查 ...

  7. IMDG中的陷阱和问题

    陷阱 使用cache API时,一个最重要的问题就是潜在的数据加载.因为IMDG提供的分布式集合也都是实现的JDK的Map.Set等接口,以JDK的Map为例,它接口规定put和remove返回被替换 ...

  8. NewSQL数据库VoltDB特性简介

    VoltDB是一个革命性的新型数据库产品,被称作NewSQL数据库.它基于H-Store,号称比当前数据库产品的吞吐量高45倍,同时又具有很高的扩展性.它的特性主要有以下几点: Ø  高吞吐.低延迟: ...

  9. EBS各个应用简称

     模块全称 Banking Center 模块简称 FPT 服务器目录 FPT_TOP Billing Connect CUE CUE_TOP CADView-3D DDD DDD_TOP CPG ...

  10. Android中常用开发工具类—持续更新...

    一.自定义ActionBar public class ActionBarTool { public static void setActionBarLayout(Activity act,Conte ...