JPA中,一对多关系使用@OneToMany标示
关系维护端:
1 1 package com.yl.demo1.bean.oneTomany; 2 2 3 3 import javax.persistence.CascadeType; 4 4 import javax.persistence.Column; 5 5 import javax.persistence.Entity; 6 6 import javax.persistence.GeneratedValue; 7 7 import javax.persistence.Id; 8 8 import javax.persistence.JoinColumn; 9 9 import javax.persistence.ManyToOne; 1010 1111 1212 @Entity 1313 public class OrderItem { 1414 1515 private Integer id; 1616 private String productName; 1717 private Float sellPrice; 1818 private Order order; 1919 2020 @Id @GeneratedValue 2121 public Integer getId() { 2222 return id; 2323 } 2424 public void setId(Integer id) { 2525 this.id = id; 2626 } 2727 @Column(length=40, nullable=false) 2828 public String getProductName() { 2929 return productName; 3030 } 3131 public void setProductName(String productName) { 3232 this.productName = productName; 3333 } 3434 @Column(nullable=false) 3535 public Float getSellPrice() { 3636 return sellPrice; 3737 } 3838 public void setSellPrice(Float sellPrice) { 3939 this.sellPrice = sellPrice; 4040 } 4141 /** 4242 * optional代表属性是否可选, 4343 * true--代表字段可为空 4444 * false--代表字段不允许为null 4545 * 4646 * @JoinColumn---指定外键的名称 4747 */ 4848 @ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH}, optional=true) 4949 @JoinColumn(name="order_id") 5050 public Order getOrder() { 5151 return order; 5252 } 5353 public void setOrder(Order order) { 5454 this.order = order; 5555 } 5656 5757 5858 }
关系被维护端:
1 1 package com.yl.demo1.bean.oneTomany; 2 2 3 3 import java.util.HashSet; 4 4 import java.util.Set; 5 5 6 6 import javax.persistence.CascadeType; 7 7 import javax.persistence.Column; 8 8 import javax.persistence.Entity; 9 9 import javax.persistence.FetchType; 1010 import javax.persistence.Id; 1111 import javax.persistence.OneToMany; 1212 import javax.persistence.Table; 1313 /** 1414 * JPA中,1-m的双向关系中,多的一方为关系维护端,关系维护端服务外键记录的更新,关系被维护端是没有权利更新外键记录的 1515 * 1616 * 1717 */ 1818 @Entity 1919 @Table(name="orders") 2020 public class Order { 2121 private String orderId; 2222 private Float amount = 0f; 2323 private Set<OrderItem> items = new HashSet<OrderItem>(); 2424 2525 @Id @Column(length=12) 2626 public String getOrderId() { 2727 return orderId; 2828 } 2929 public void setOrderId(String orderId) { 3030 this.orderId = orderId; 3131 } 3232 @Column(nullable=false) 3333 public Float getAmount() { 3434 return amount; 3535 } 3636 public void setAmount(Float amount) { 3737 this.amount = amount; 3838 } 3939 /**级联操作 4040 * CascadeType.REFRESH--select order, select OrderItem 4141 * CascadeType.PERSIST--insert into Order, insert into OrderItem 4242 * CascadeType.MERGE----当Order处于游离状态时,对Order更新,也会更新OrderItem--update Order, for(update OrderItem) 4343 * CascadeType.REMOVE---delete Order, delete OrderItem 4444 * 可以采用CascadeType.ALL包括上述四种. 4545 * 上述四种方法只有调用相应的方法时才会触发。即EntityManager.refresh(),EntityManager.persist(),EntityManager.merge(), EntityManager.remove() 4646 * 4747 * *ToMany的fetch默认值为FetchType.LAZY 4848 * *ToOne的fetch默认值为FetchType.EAGER 4949 * 5050 * 5151 * mappedBy出现在关系的被维护端,它指定在关系维护端是由哪个属性进行维护关系 5252 */ 5353 @OneToMany(cascade={CascadeType.REFRESH, CascadeType.PERSIST} 5454 , fetch=FetchType.LAZY 5555 , mappedBy="order") 5656 public Set<OrderItem> getItems() { 5757 return items; 5858 } 5959 public void setItems(Set<OrderItem> items) { 6060 this.items = items; 6161 } 6262 6363 6464 public void addOrderItem(OrderItem orderItem) { 6565 orderItem.setOrder(this); 6666 this.items.add(orderItem); 6767 } 6868 6969 }
常见操作:
1 1 @Test 2 2 public void save() { 3 3 EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL"); 4 4 EntityManager em = factory.createEntityManager(); 5 5 em.getTransaction().begin();//事务开始 6 6 7 7 Order order = new Order(); 8 8 order.setAmount(34f); 9 9 order.setOrderId("999"); 1010 1111 OrderItem orderItem1 = new OrderItem(); 1212 orderItem1.setProductName("football"); 1313 orderItem1.setSellPrice(90f); 1414 1515 OrderItem orderItem2 = new OrderItem(); 1616 orderItem2.setProductName("basketball"); 1717 orderItem2.setSellPrice(100f); 1818 1919 order.addOrderItem(orderItem1); 2020 order.addOrderItem(orderItem2); 2121 2222 em.persist(order); 2323 2424 em.getTransaction().commit(); 2525 em.close(); 2626 factory.close(); 2727 }