OntToMany级联操作

来源:互联网 发布:淘宝知识产权侵权处罚 编辑:程序博客网 时间:2024/06/04 18:40

persistence.xml参考前一篇

Order.java

package cn.itcast.bean;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
@Entity
@Table(name="orders")//order与sql语句中的order by会发生冲突,因此必须改名
public class Order {
 private String orderid;
 private Float amount=0f;
 private Set<OrderItem> items=new HashSet<OrderItem>();
 
 /** CascadeType.REFRESH 级联刷新
  *  CascadeType.PERSIST 级联插入,只有在调用persist方法时才有作用
  *  CascadeType.MERGE 级联更新,只有在调用merge方法时才有作用
   *  CascadeType.REMOVE 级联删除,只有在调用remove方法时才有作用
  *  CascadeType.All 包括全部 
  *  fetch=FetchType.LAZY延迟加载(在many情况下,默认是延迟加载,在one情况下,默认是立即加载)
  *  mappedBy="order"表示这个类是 关系被维护端,指明该实体内被维护的属性为order
  **/
 @OneToMany(cascade={CascadeType.REFRESH,CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE},fetch=FetchType.LAZY,mappedBy="order")
    public Set<OrderItem> getItems() {
  return items;
 }
 public void setItems(Set<OrderItem> items) {
  this.items = items;
  }
 @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;
 } 
 public void addOrderItem(OrderItem orderItem)
 {
  orderItem.setOrder(this);
  this.items.add(orderItem);  
 }
}

OrderItem.java

package cn.itcast.bean;
import javax.persistence.Entity;
import javax.persistence.*;

@Entity
public class OrderItem {
 private Integer id;
 private String productName;
 private Float sellPrice=0f;
 private Order order;

    /**
     * 多的一方不需要 级联保存,不需要级联删除
     * optional=true表示可选,表示此项可以为空
 **/
 @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=true)
 @JoinColumn(name="order_id")//外键名称order_id
 public Order getOrder() {
  return order;
 }
 public void setOrder(Order order) {
  this.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;
 }
}

OneToManyTest.java测试

package junit.test;
import java.util.UUID;
import javax.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 save(){  
  EntityManagerFactory factory=Persistence.createEntityManagerFactory("itcast");
  EntityManager em=factory.createEntityManager();
  em.getTransaction().begin();
  Order order=new Order();
  order.setAmount(34f);
  order.setOrderid("999");//UUID.randomUUID().toString()
  OrderItem orderItem1=new  OrderItem();
  orderItem1.setProductName("足球");
  orderItem1.setSellPrice(90f);
  OrderItem orderItem2=new  OrderItem();
  orderItem2.setProductName("瑜珈球");
  orderItem2.setSellPrice(30f);
  order.addOrderItem(orderItem1);
  order.addOrderItem(orderItem2);
  em.persist(order);
  em.getTransaction().commit();
  em.close();
  factory.close();
 }
}

===============================================

Order.java 订单,包括一个HashSet,标明一个订单包括多个的订单(项)详情,此字段级联了所有的方法(添加、删除、合并、刷新,默认为延迟加载,mappedBy="order"表示这是一个被维护端

OrderItem.java订单详情,包括了一个Order,并用JoinColumn标明这是一个外键,option="true"表示这一项可以为空,此字段只可以级联Refresh、Merge这两种方法,即刷新和保存。

原创粉丝点击