@OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
来源:互联网 发布:尺八制作图数据 编辑:程序博客网 时间:2024/06/07 01:01
例如我们用一个例子来开启JPA的一对多和多对一的学习。
比如你去当当网上买书籍,当当网就给你一个订单。
通过上面的业务活动描述你可以分析得出:一个订单可以包含一个或多个订单项.那么我们将将订单和订单项设计关系为(1:N)一对多的关系(排除0)。得出关系我们就使用JPA来实现这个关系(关于建立JPA和基本的配置我就不再说了,如果不明白请看JPA入门篇)。
首先建立订单实体类
Java代码
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);
}
}
订单项的实体类
Java代码
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;
}
}
下面看看测试类
Java代码
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();
}
}
比如你去当当网上买书籍,当当网就给你一个订单。
通过上面的业务活动描述你可以分析得出:一个订单可以包含一个或多个订单项.那么我们将将订单和订单项设计关系为(1:N)一对多的关系(排除0)。得出关系我们就使用JPA来实现这个关系(关于建立JPA和基本的配置我就不再说了,如果不明白请看JPA入门篇)。
首先建立订单实体类
Java代码
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);
}
}
订单项的实体类
Java代码
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;
}
}
下面看看测试类
Java代码
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();
}
}
0 0
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- @OneToMany或@ManyToOne的用法-annotation关系映射篇
- 自己总结一下关联关系映射中的OneToMany,ManyToOne,单向,双向注意的事项!ps:例子
- 11hibernate hibernate的关系映射之OneToMany和ManyToOne(重点)
- 双向一对多(多对一)@OneToMany或@ManyToOne的用法
- @OneToMany,ManyToOne双向关系(@OneToMany和@ManyToOne都得写的)
- @ManyToOne和@OneToMany的用法的自我小结
- Hibernate关系映射(五)一对多、多对一双向关联@OneToMany @OneToMany Annotation方式
- @ManyToOne @OneToMany
- Hibernate关系映射(三)多对一单向关联@ManyToOne Annotation方式
- @ManyToOne 和@oneToMany中@@JoinColumn的区别
- Play框架的@OneToMany、@ManyToOne级联操作
- Hibernate关系映射(四)一对多单向关联@OneToMany Annotation方式
- Hibernate08_映射关系---OneToMany单向
- 各种JS验证和操作
- ASP.NET Web API 简介
- CISCO和H3C交换机备份配置
- 百度地图sdk Android部署方法
- VB.NET学习笔记二之编写软件
- @OneToMany或@ManyToOne的用法-annotation关系映射篇(上)
- 递归问题归类
- C# 多线程方式 Thread Delegate
- maven跳过单元测试的两个参数区别
- char,nchar,varchar,nvarchar的区别
- 偶尔串下门
- 个人笔记 asp 03 链接ACCESS数据库并使用recordset数据集
- C Primer Plus 6.16.3
- Python操作mysql