JPA一对多关联

  关于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 @Entity
14 @Table(name = "orders")
15 public class Order {
16 
17     private String orderId;
18     private Float amoutn = 0f;
19     private Set<OrderItem> items = new HashSet<OrderItem>();
20 
21     @Id
22     @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更改的时候,就重新加载orderItems
41 
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<OrderItem> getItems() {
54         return items;
55     }
56 
57     public void setItems(Set<OrderItem> 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 @Entity
12 public class OrderItem {
13     private Integer id;
14     private String productName;
15     private Float sellPrice = 0f;
16     private Order order;
17 
18     @Id
19     @GeneratedValue
20     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,在数据库中允许为null
47     @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,此时也会保持OrderItem
25         manager.persist(order);
26 
27         manager.getTransaction().commit();
28         manager.clear();
29         factory.close();
30     }

 

posted on 2013-12-05 17:06  烟火_  阅读(564)  评论(0编辑  收藏  举报

导航