关于JPA一对多关联这里使用Order与OrderItem来模拟。一个Order可以关联多个OrderItem,而一个OrderItem只能关联一个Order。Order与OrderItem是一对多的关联关系。Order类如下:
1 package com.yichun.bean; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 import javax.persistence.CascadeType; 7 import javax.persistence.Column; 8 import javax.persistence.Entity; 9 import javax.persistence.Id;10 import javax.persistence.OneToMany;11 import javax.persistence.Table;12 13 @Entity14 @Table(name = "orders")15 public class Order {16 17 private String orderId;18 private Float amoutn = 0f;19 private Setitems = new HashSet ();20 21 @Id22 @Column(length = 12, nullable = false)23 public String getOrderId() {24 return orderId;25 }26 27 public void setOrderId(String orderId) {28 this.orderId = orderId;29 }30 31 @Column(nullable = false)32 public Float getAmoutn() {33 return amoutn;34 }35 36 public void setAmoutn(Float amoutn) {37 this.amoutn = amoutn;38 }39 40 // CascadeType.REFRESH,级联刷新。orderItems更改的时候,就重新加载orderItems41 42 // CascadeType.PERSIST, 级联保存。insert order insert into orderitem 。调用manager.persist(new Order())的时候才会起作用43 44 // CascadeType.MERGE,级联更新 。order在游离状态的时候被修改了,order中的orderItem也被修改了,update order for (update orderItem)。 调用manager.merge(order) 的时候才会起作用45 46 // CascadeType.REMOVE级联删除。 删除order的时候,orderItems也会被删除,没有住外键约束的时候。调用manager.remove(order)的时候才会起作用。47 48 // 针对实体管理器的四种方法49 // fetch =FetchType.LAZY默认是延迟加载。××tomany由一方得到多的一方的时候,默认就是延迟加载,××toone的时候,默认就是立即加载50 // 出现mappedBy的类就是关系被维护端。关系由对方里面的order属性维护51 @OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,52 CascadeType.MERGE, CascadeType.REMOVE }, mappedBy = "order")53 public Set getItems() {54 return items;55 }56 57 public void setItems(Set items) {58 this.items = items;59 }60 61 // 建立两者之间的关系62 public void addOrderItem(OrderItem orderItem) {63 orderItem.setOrder(this);64 this.items.add(orderItem);65 }66 }
OrderItem类如下:
1 package com.yichun.bean; 2 3 import javax.persistence.CascadeType; 4 import javax.persistence.Column; 5 import javax.persistence.Entity; 6 import javax.persistence.GeneratedValue; 7 import javax.persistence.Id; 8 import javax.persistence.JoinColumn; 9 import javax.persistence.ManyToOne;10 11 @Entity12 public class OrderItem {13 private Integer id;14 private String productName;15 private Float sellPrice = 0f;16 private Order order;17 18 @Id19 @GeneratedValue20 public Integer getId() {21 return id;22 }23 24 public void setId(Integer id) {25 this.id = id;26 }27 28 @Column(length = 40, nullable = false)29 public String getProductName() {30 return productName;31 }32 33 public void setProductName(String productName) {34 this.productName = productName;35 }36 37 @Column(nullable = false)38 public Float getSellPrice() {39 return sellPrice;40 }41 42 public void setSellPrice(Float sellPrice) {43 this.sellPrice = sellPrice;44 }45 46 // optional=true,在数据库中允许为null47 @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = true)// 级联更新,级联刷新48 @JoinColumn(name = "order_id")49 public Order getOrder() {50 return order;51 }52 53 public void setOrder(Order order) {54 this.order = order;55 }56 }
保存数据:
1 @Test 2 public void save() { 3 EntityManagerFactory factory = Persistence 4 .createEntityManagerFactory("testjpa"); 5 EntityManager manager = factory.createEntityManager(); 6 manager.getTransaction().begin(); 7 8 Order order = new Order(); 9 order.setAmoutn(120f);10 order.setOrderId("999");// UUID.randomUUID().toString()11 12 OrderItem item = new OrderItem();13 item.setProductName("足球");14 item.setSellPrice(90f);15 16 OrderItem item2 = new OrderItem();17 item2.setProductName("排球");18 item2.setSellPrice(30f);19 20 // 设置两者之间的关联21 order.addOrderItem(item);22 order.addOrderItem(item2);23 24 // 保存Order,此时也会保持OrderItem25 manager.persist(order);26 27 manager.getTransaction().commit();28 manager.clear();29 factory.close();30 }