1.一对多的映射关系
demo:订单和订单项规范: 多的一方维护外键的更新(关系维护端),一的一方没有权利更新外键(被维护关系端)
1.Cascade级联操作类型:(使用前提是对应的实体管理方法),当对某实体进行某操作时,会同时对具有映射关系的实体其相应操作
REFRESH:获取最新的数据
PERSIST:保存
MERGE:更新
REMOVEL:删除
2.加载类型为懒惰加载(碰到某人many的加载类型为延迟加载,碰到one便立即加载)
3.被维护端关系实体会出现mappedby(外键字段)
2.demo:订单和订单项
1.实体bean Order和OrderItem
@Entity
@Table(name="orders")
public class Order {
/**
* 订单编号
*/
private String orderId;
/**
* 订单总价
*/
private Double cost=0d;
/**
* 订单项
*/
private Set<OrderItem> items=new HashSet<OrderItem>();
/**
* @return the orderId
*/
@Id @Column(length=36)
public String getOrderId() {
return orderId;
}
/**
* @param orderId the orderId to set
*/
public void setOrderId(String orderId) {
this.orderId = orderId;
}
/**
* @return the cost
*/
@Column(nullable=false)
public Double getCost() {
return cost;
}
/**
* @param cost the cost to set
*/
public void setCost(Double cost) {
this.cost = cost;
}
/**
* @return the items
*/
@OneToMany(cascade={CascadeType.REFRESH,CascadeType.PERSIST,CascadeType.REMOVE,CascadeType.MERGE}
,mappedBy="order")
public Set<OrderItem> getItems() {
return items;
}
/**
* @param items the items to set
*/
public void setItems(Set<OrderItem> items) {
this.items = items;
}
/**
* 增加订单项
* @param oi
*/
public void addItems(OrderItem oi){
this.items.add(oi);
oi.setOrder(this);
}
}
@Entity
public class OrderItem {
/**
* 订单项编号
*/
private Integer itemId;
/**
* 商品名称
*/
private String productName;
/**
* 商品价格
*/
private Double price=0d;
/**
* 所属订单
*/
private Order order;
/**
* @return the productName
*/
@Column(length=40,nullable=false)
public String getProductName() {
return productName;
}
/**
* @param productName the productName to set
*/
public void setProductName(String productName) {
this.productName = productName;
}
/**
* @return the price
*/
@Column(nullable=false)
public Double getPrice() {
return price;
}
/**
* @param price the price to set
*/
public void setPrice(Double price) {
this.price = price;
}
/**
* @return the itemId
*/
@Id @GeneratedValue
public Integer getItemId() {
return itemId;
}
/**
* @param itemId the itemId to set
*/
public void setItemId(Integer itemId) {
this.itemId = itemId;
}
/**
* @return the order
* 只需要级联更新
* optional=false,代表必须存在外键字段
*/
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},fetch=FetchType.EAGER,optional=false)
@JoinColumn(name="orderId")
public Order getOrder() {
return order;
}
/**
* @param order the order to set
*/
public void setOrder(Order order) {
this.order = order;
}
}
2
.单元测试
public class OneToManyTest {
@Test
public void test(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJpa");
factory.close();
}
@Test
public void save(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJpa");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();
Order order=new Order();
order.setOrderId(UUID.randomUUID().toString());
OrderItem item1=new OrderItem();
item1.setProductName("Mac pro");
item1.setPrice(9000d);
OrderItem item2=new OrderItem();
item2.setProductName("X1");
item2.setPrice(10000d);
OrderItem item3=new OrderItem();
item3.setProductName("air");
item3.setPrice(7000d);
order.addItems(item1);
order.addItems(item2);
order.addItems(item3);
order.setCost(26000d);
em.persist(order);
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void update(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJpa");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();
Order order=em.find(Order.class, "57372f24-ada7-4c66-b410-ad2aa2cca23b");
Set<OrderItem> sets=order.getItems();
for (OrderItem orderItem : sets) {
if(orderItem.getProductName().equals("air")){
orderItem.setPrice(7888d);
}
}
order.setCost(26888d);
em.getTransaction().commit();
em.close();
factory.close();
}
//删除同上操作....
@Test
public void test1(){
System.out.println(UUID.randomUUID().toString());
}
}