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这两种方法,即刷新和保存。