jpa一对多映射案例

简介: 订单和订单项就是一对多的关系。一个订单有多个订单项,一个订单项属于某个订单。订单和订单项映射后的表结构如下:订单表结构订单项表结构下面就以订单和订单项为例介绍多对多映射关系的实例开发persistence.xml配置文件 <?xml version="1.0"?><persistence xmlns="http://java.sun.com/xml/

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

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

订单表结构

订单项表结构

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

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. class , (Serializable) 3 ); 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 " ); } }
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
数据库
SAP系统不能启动解决方案
SAP系统不能启动解决方案
981 1
|
Java
Rational Rose正逆向工程(类图转Java代码,Java代码转类图)
 一,正向工程     1、设置默认语言为Java,Tools-&gt;Options-&gt;Notation-&gt;default:选择Java。         2、设置环境变量ClassPath,Tools-&gt;Java/j2ee-&gt;Project   Specification-&gt;ClassPath:具体路径设置为正向工程生成java文件要保存
3006 0
|
存储 安全 IDE
Python曝出15年“老洞”,绿盟君教你如何不“踩坑”
近日,Python的Tarfile模块中发现一个存在长达15年之久的漏洞,引起了大家的关注,一是存在时间比较久,最早在2007年就被披露并记录为CVE-2007-4559;二是可能影响超过35万个开源存储库。
728 0
Python曝出15年“老洞”,绿盟君教你如何不“踩坑”
|
索引 数据处理
Elasticsearch词频统计实现与原理解读
有了分词,开发中会遇到,某个索引的文档集合中,共有多少XX关键词?
5031 0
Elasticsearch词频统计实现与原理解读
|
分布式计算 Java Hadoop
hadoop-HA集群搭建,启动DataNode,检测启动状态,执行HDFS命令,启动YARN,HDFS权限配置,C++客户端编程,常见错误
本篇博文为整理网络上Hadoop-HA搭建后出来的博客,参考网址为:http://blog.chinaunix.net/uid-196700-id-5751309.html 3. 部署 3.1. 机器列表 共5台机器(zookeeper部署在这5台机器上),部署如下表所示: NameNode JournalNode DataNode ZooKeeper 192.168.106
8669 0
|
Android开发 应用服务中间件
Eclipse问题
1.tomcat启动报错:Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor. 解决方法:在工作空间--&gt;.meta
1428 0
|
Oracle 关系型数据库 数据库
查看oracle数据库的连接数以及用户 (转:http://blog.itpub.net/24558279/viewspace-752293/)
11、查询oracle的连接数2select count(*) from v$session;32、查询oracle的并发连接数4select count(*) from v$session where status='ACTIVE';53、查看不同用户的连接数6select username,count(username) from v$session where username is n
1494 0
|
SQL 缓存 Java
【持久化框架】Mybatis与Hibernate的详细对比
最近做了一个hibernate与MyBatis的对比总结,希望大家指出不对之处。 一.   Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.NET,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。 MyBatis 参考资
3251 0
|
Java 数据库连接 数据库
Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister报错解决办法
初学Hibernate 框架,在练习数据库的关联关系映射实验测试中出现了Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister错误。 由此引出的的错误提示: Could not parse mapping document from resource org/vo/Hi
3394 0
|
Oracle 关系型数据库 数据安全/隐私保护
Oracle 11g客户端及PLSQL Developer配置|Instant Client Setup-64位|OraClientLite11g_x86
转载自:http://blog.csdn.net/xiaoyw71/article/details/45311589 Oracle 11g客户端 资源     下载资源,直接解压进行配置     Oracle官方资源:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html  
5023 0

热门文章

最新文章