关于JPA一对多关联这里使用Order与OrderItem来模拟。一个Order可以关联多个OrderItem,而一个OrderItem只能关联一个Order。Order与OrderItem是一对多的关联关系。Order类如下:

 package com.yichun.bean;

 import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table; @Entity
@Table(name = "orders")
public class Order { private String orderId;
private Float amoutn = 0f;
private Set<OrderItem> items = new HashSet<OrderItem>(); @Id
@Column(length = 12, nullable = false)
public String getOrderId() {
return orderId;
} public void setOrderId(String orderId) {
this.orderId = orderId;
} @Column(nullable = false)
public Float getAmoutn() {
return amoutn;
} public void setAmoutn(Float amoutn) {
this.amoutn = amoutn;
} // CascadeType.REFRESH,级联刷新。orderItems更改的时候,就重新加载orderItems // CascadeType.PERSIST, 级联保存。insert order insert into orderitem 。调用manager.persist(new Order())的时候才会起作用 // CascadeType.MERGE,级联更新 。order在游离状态的时候被修改了,order中的orderItem也被修改了,update order for (update orderItem)。 调用manager.merge(order) 的时候才会起作用 // CascadeType.REMOVE级联删除。 删除order的时候,orderItems也会被删除,没有住外键约束的时候。调用manager.remove(order)的时候才会起作用。 // 针对实体管理器的四种方法
// fetch =FetchType.LAZY默认是延迟加载。××tomany由一方得到多的一方的时候,默认就是延迟加载,××toone的时候,默认就是立即加载
// 出现mappedBy的类就是关系被维护端。关系由对方里面的order属性维护
@OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,
CascadeType.MERGE, CascadeType.REMOVE }, mappedBy = "order")
public Set<OrderItem> getItems() {
return items;
} public void setItems(Set<OrderItem> items) {
this.items = items;
} // 建立两者之间的关系
public void addOrderItem(OrderItem orderItem) {
orderItem.setOrder(this);
this.items.add(orderItem);
}
}

OrderItem类如下:

 package com.yichun.bean;

 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; @Entity
public class OrderItem {
private Integer id;
private String productName;
private Float sellPrice = 0f;
private Order order; @Id
@GeneratedValue
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Column(length = 40, nullable = false)
public String getProductName() {
return productName;
} public void setProductName(String productName) {
this.productName = productName;
} @Column(nullable = false)
public Float getSellPrice() {
return sellPrice;
} public void setSellPrice(Float sellPrice) {
this.sellPrice = sellPrice;
} // optional=true,在数据库中允许为null
@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = true)// 级联更新,级联刷新
@JoinColumn(name = "order_id")
public Order getOrder() {
return order;
} public void setOrder(Order order) {
this.order = order;
}
}

保存数据:

     @Test
public void save() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("testjpa");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin(); Order order = new Order();
order.setAmoutn(120f);
order.setOrderId("999");// UUID.randomUUID().toString() OrderItem item = new OrderItem();
item.setProductName("足球");
item.setSellPrice(90f); OrderItem item2 = new OrderItem();
item2.setProductName("排球");
item2.setSellPrice(30f); // 设置两者之间的关联
order.addOrderItem(item);
order.addOrderItem(item2); // 保存Order,此时也会保持OrderItem
manager.persist(order); manager.getTransaction().commit();
manager.clear();
factory.close();
}

JPA一对多关联的更多相关文章

  1. jpa单向一对多关联映射

    如果在一的@OneToMany有@manyToOne则是双向一对多关联,如果在多的那面没有@manyToOne关联则是单向一对多关联 class和student是一对多的关系 表结构 student ...

  2. 关于mybatis一对多关联时

    一对多关联时注:collection标签,property属性名称,column参数字段, ofType查询返回类型,select查询方法,javaType方法的返回类型

  3. (Hibernate进阶)Hibernate映射——一对多关联映射(七)

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

  4. EF – 7.一对多关联

    5.6.8 <一对多关联(上)> 5.6.9 <一对多关联(下)> 一对多的关联,可以说是整个数据库应用程序中最常见的一种关联类型了,因此,必须高度重视这种关联类型CRUD的实 ...

  5. 7.mybatis一对多关联查询

    和第5节一对一查询类似,但是不同的是,一对一使用的是association,而一对多使用collection. 实例: 1个班级Class,对应1个老师Teacher,对应多个学生Student 1. ...

  6. [转]NHibernate之旅(10):探索父子(一对多)关联查询

    本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NH ...

  7. MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)

    MyBitis(iBitis)系列随笔之一:MyBitis入门实例 MyBitis(iBitis)系列随笔之二:类型别名(typeAliases)与表-对象映射(ORM) MyBitis(iBitis ...

  8. MyBatis从入门到放弃四:一对多关联查询

    前言 上篇学习了一对一关联查询,这篇我们学习一对多关联查询.一对多关联查询关键点则依然是配置resultMap,在resultMap中配置collection属性,别忽略了ofType属性. 搭建开发 ...

  9. 014 一对多关联映射 单向(one-to-many)

    在对象模型中,一对多的关联关系,使用集合来表示. 实例场景:班级对学生:Classes(班级)和Student(学生)之间是一对多的关系. 多对一.一对多的区别: 多对一关联映射:在多的端加入一个外键 ...

随机推荐

  1. 请求参数到表述层的类型转换——Struts2

    一.简介 说明:HTTP 协议传输数据没有类型的概念,在服务器端是通过 request.getParameter().request.getParameterValue() 方法得到请求参数为 Str ...

  2. 转载---CSS3实现曲线阴影和翘边阴影

    预备知识 DIV+CSS基础 圆角:border-radius 2D变换:transform:skew && rotate 伪类::before 和 :after 代码 HTML结构代 ...

  3. C# 生成BMP图片

    ;i<;i++) { Bitmap bmp=new Bitmap(this.pictureBox1.Image); Graphics g=Graphics.FromImage((Image)bm ...

  4. KTV点歌系统

    经过十多天的艰苦奋战,MyKTV点歌系统终于成型,从刚开始接到项目的茫然,到完成项目时的喜悦,整个过程的艰辛和付出只有自己知道.虽然这个项目还有许多需要完善的地方,譬如添加歌词信息,实现窗体的美化等, ...

  5. HTML5实现屏幕手势解锁(转载)

    来源:https://github.com/lvming6816077/H5lockhttp://threejs.org/examples/http://www.inf.usi.ch/phd/wett ...

  6. Urlencode and Urldecode 命令行

    由于经常使用,简单记录之 $ alias urlencode='python -c "import sys, urllib as ul; print ul.quote_plus(sys.ar ...

  7. java阻塞队列

    对消息的处理有些麻烦,要保证各种确认.为了确保消息的100%发送成功,笔者在之前的基础上做了一些改进.其中要用到多线程,用于重复发送信息. 所以查了很多关于线程安全的东西,也看到了阻塞队列,发现这个模 ...

  8. fibonacci封闭公式

    Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f ...

  9. Verilog学习笔记设计和验证篇(一)...............总线和流水线

    总线 总线是运算部件之间数据流通的公共通道.在硬线逻辑构成的运算电路中只要电路的规模允许可以比较自由的确定总线的位宽,从而大大的提高数据流通的速度.各个运算部件和数据寄存器组可以通过带有控制端的三态门 ...

  10. ADO.NET 增删改查的基本用法

    ADO.NET:数据访问技术 就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中也可以将数据库中的数据提取到内存中供程序调用 所有数据访问技术的基础 连接 ...