类似于hibernate的一对多和多对一关系,JPA也支持这种关系。多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端是没有权利更新外键记录。
例如订单和订单项之间的关系
Order.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;
private Set<OrderItem> items=new HashSet<OrderItem>();
@Id @Column(length=12)
public String getOrderid() {
return Orderid;
}
public void setOrderid(String orderid) {
Orderid = orderid;
}
@Column(nullable=false)
public Float getAmount() {
return amount;
}
public void setAmount(Float amount) {
this.amount = amount;
}
/**
JPA中的mappedBy类似于hibernate中的
<set name="items" inverse=true></set>
代表对方为关系维护端,本类为关系被维护端
*/
@OneToMany(cascade={CascadeType.REFRESH,CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE} //cascade级联
,mappedBy="order" //出现mappedBy的类是关系被维护端,维护关系的order属性
,fetch=FetchType.LAZY)//懒加载
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.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;
}
/**
JPA中的Joincolumn类似于hibernate中的
<ManytoOne column="">
*/
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH}
,optional=false)//是否可选,也即数据库中是否可以使null
@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("unitName");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();
Order order=new Order();
order.setAmount(34f);
order.setOrderid("999");
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();
}