转@OneToMany或@ManyToOne的用法-annotation关系映射篇(上)

时间:2022-08-31 08:54:23

原文:http://blog.sina.com.cn/s/blog_6fef491d0100obdm.html

例如我们用一个例子来开启JPA的一对多和多对一的学习。

比如你去当当网上买书籍,当当网就给你一个订单。
 
通过上面的业务活动描述你可以分析得出:一个订单可以包含一个或多个订单项.那么我们将将订单和订单项设计关系为(1:N)一对多的关系(排除0)。
得出关系我们就使用JPA来实现这个关系(关于建立JPA和基本的配置我就不再说了,如果不明白请看JPA入门篇)。

首先建立订单实体类

 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 amount = 0f;
private Set<OrderItem> items = new HashSet<OrderItem>(); @Id
@Column(length = 12)
public String getOrderid() {
return orderid;
} public void setOrderid(String orderid) {
this.orderid = orderid;
} @Column(nullable = false)
public Float getAmount() {
return amount;
} public void setAmount(Float amount) {
this.amount = amount;
} @OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE },mappedBy ="order") //这里配置关系,并且确定关系维护端和被维护端。mappBy表示关系被维护端,只有关系端有权去更新外键。这里还有注意OneToMany默认的加载方式是赖加载。当看到设置关系中最后一个单词是Many,那么该加载默认为懒加载
public Set<OrderItem> getItems() {
return items;
} public void setItems(Set<OrderItem> items) {
this.items = items;
} /**
*该方法用于向order中加order项
/*
public void addOrderItem(OrderItem orderItem){
orderItem.setOrder(this);//用关系维护端来维护关系
this.items.add(orderItem);
} }

订单项的实体类

 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;
} @ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH }, optional = true)
@JoinColumn(name="order_id")//这里设置JoinColum设置了外键的名字,并且orderItem是关系维护端
public Order getOrder() {
return order;
} public void setOrder(Order order) {
this.order = order;
} }

下面看看测试类

 import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence; import org.junit.BeforeClass;
import org.junit.Test; import cn.itcast.bean.Order;
import cn.itcast.bean.OrderItem; public class OneToManyTest { @BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test public void addOrder(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin(); // start transaction Order order = new Order();
order.setAmount(34f);
order.setOrderid("00001"); //order中包含的OrderItem项OrderItem1,OrderItem2
OrderItem orderItem1 = new OrderItem();
orderItem1.setProductName("书");
orderItem1.setSellPrice(22f);
order.addOrderItem(orderItem1); //add orderitem in order OrderItem orderItem2 = new OrderItem();
orderItem2.setProductName("篮球");
orderItem2.setSellPrice(100f);
order.addOrderItem(orderItem2); em.persist(order); //persist order object
em.getTransaction().commit(); //commit transaction
em.close();
factory.close();
}
}

转@OneToMany或@ManyToOne的用法-annotation关系映射篇(上)的更多相关文章

  1. 转&commat;ManyToMany- annotation关系映射篇(下)

    原文:http://blog.sina.com.cn/s/blog_6fef491d0100obdd.html 终于要说ManyToMany了 场景:Product和Customer. 先看TestP ...

  2. Hibernate -- 注解(Annotation)关系映射

    转自:http://www.cnblogs.com/tyler2000/archive/2011/01/20/1940354.html 1. Hibernate Annotation关系映射有下面几种 ...

  3. Hibernate注解关系映射

    Hibernate Annotation关系映射的几种类型映射用法及使用方法(说明:以前实例的实体是user和role,主键分别是userid和roleid)   1)一对一外键关联映射(单向) @O ...

  4. JPA实体关系映射:&commat;ManyToMany多对多关系、&commat;OneToMany&commat;ManyToOne一对多多对一关系和&commat;OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  5. hibernate注解之&commat;Onetomany、&commat;Manytoone、&commat;JoinColumn

    @Onetomany用于实体类与数据库表映射中少的一方,请看下面的例子. 假设一个用户只有一种角色,用户和角色是onetomany的关系 用户实体 @Entity @Table(name=" ...

  6. Hibernate学习笔记:注解&commat;OneToMany和&commat;ManyToOne的单独使用问题 不成对使用

    以某个实际场景为例,现在两张表:用户表User 订单表Order:很显然用户对订单是一对多的关系.二者注解如下 用户表User @Entity @Table(name="users&quot ...

  7. JPA之&commat;OneToMany、&commat;ManyToOne、&commat;JoinColumn

    顾名思义,@OneToMany.@ManyToOne这两个注解就是处理一对多,多对一的关系 这两个注解是成双成对的,有了@OneToMany,一定会配置一个@ManyToOne OneToMany设置 ...

  8. android对象关系映射框架ormlite之一对多(OneToMany)

    前两天,用ormlite对单张表进行了基本的操作,但是,我们知道通常情况对于单张表格进行操作在实际情况中很前两天不现实,那么ormlite能否像Hibenate那样实现多张表之间的一对多,多对多(即O ...

  9. JPA总结——实体关系映射(一对多&commat;OneToMany)

    JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...

随机推荐

  1. linux学习之九 学习过程总结

    ~写在前面 首先非常感谢孟老师的悉心讲解,使用这种新颖的教学方式(MOOC课堂+博客),也感到非常有幸随着老师的思路对linux的内核进行了初步的系统学习.结合代码和gdb调试工具跟踪分析对linux ...

  2. ruby -- 问题解决(二)rails4&period;0create引起的ActiveModel&colon;&colon;ForbiddenAttributesError错误

    之前将rails升级到4.0版本,发生了ActiveModel::ForbiddenAttributesError错误 于是上网溜达了一会,找到解决方案, ActiveModel::Forbidden ...

  3. Maven 系列 一 :Maven 快速入门及简单使用【转】

    开发环境 MyEclipse 2014 JDK 1.8 Maven 3.2.1 1.什么是Maven? Maven是一个项目管理工具,主要用于项目构建,依赖管理,项目信息管理. 2.下载及安装 下载最 ...

  4. zepto源码学习-04 event

    之前说完$(XXX),然后还有很多零零碎碎的东西需要去分析,结果一看代码,发现zepto的实现都相对简单,没有太多可分析的.直接略过了一些实现,直接研究Event模块,相比JQuery的事件系统,ze ...

  5. JS常用的方法

    1.时间戳转换 //时间戳(有Date和无Date的都可)转换为日期 “2016年5月30日 10:29:30 2016-05-20 09:11” function TimeConversion(ti ...

  6. 硬杠后端(后端坑系列)——Django前期工作

    Django是一个开放源代码的Web应用框架,由Python写成,采用了MVC的框架模式. MVC MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件 ...

  7. &lbrack;译&rsqb;在vuejs中使用任意js库

    原文 全局变量 最naive的办法是通过附加类库到window对象,使之成为全局变量: entry.js window._ = require('lodash'); MyComponent.vue e ...

  8. sphinx配置文件详解

    sphinx的配置文件是在配置的时候最容易出错的了: 我们先要明白几个概念: source:数据源,数据是从什么地方来的. index:索引,当有数据源之后,从数据源处构建索引.索引实际上就是相当于一 ...

  9. VB与C&num;的区别(转载)

    由于工作原因要熟悉这两门编程语言.网上找的. VB.NET Program Structure C# Imports System Namespace Hello               Clas ...

  10. 80端口被System进程占用问题

    更新: 有可能占用80端口的服务: 如果安装了IIS,关闭IIS: 如果未开启IIS功能,而安装了诸如Web Matrix的开发程序,则有可能被Web Development Agent Servic ...