轉@OneToMany或@ManyToOne的用法-annotation關系映射篇(上)


原文:http://blog.sina.com.cn/s/blog_6fef491d0100obdm.html

例如我們用一個例子來開啟JPA的一對多和多對一的學習。

 

比如你去當當網上買書籍,當當網就給你一個訂單。
  通過上面的業務活動描述你可以分析得出:一個訂單可以包含一個或多個訂單項.那么我們將將訂單和訂單項設計關系為(1:N)一對多的關系(排除0)。得出關系我們就使用JPA來實現這個關系(關於建立JPA和基本的配置我就不再說了,如果不明白請看JPA入門篇)。

首先建立訂單實體類
 1 import java.util.HashSet;   
 2 import java.util.Set;   
 3   
 4 import javax.persistence.CascadeType;   
 5 import javax.persistence.Column;   
 6 import javax.persistence.Entity;   
 7 import javax.persistence.Id;   
 8 import javax.persistence.OneToMany;   
 9 import javax.persistence.Table;   
10   
11 @Entity  
12 @Table(name="orders")   
13 public class Order {   
14        
15     private String orderid;   
16     private Float amount = 0f;   
17     private Set<OrderItem> items = new HashSet<OrderItem>();   
18   
19     @Id  
20     @Column(length = 12)   
21     public String getOrderid() {   
22         return orderid;   
23     }   
24   
25     public void setOrderid(String orderid) {   
26         this.orderid = orderid;   
27     }   
28   
29     @Column(nullable = false)   
30     public Float getAmount() {   
31         return amount;   
32     }   
33   
34     public void setAmount(Float amount) {   
35         this.amount = amount;   
36     }   
37   
38     @OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE },mappedBy ="order") //這里配置關系,並且確定關系維護端和被維護端。mappBy表示關系被維護端,只有關系端有權去更新外鍵。這里還有注意OneToMany默認的加載方式是賴加載。當看到設置關系中最后一個單詞是Many,那么該加載默認為懶加載   
39     public Set<OrderItem> getItems() {   
40         return items;   
41     }   
42   
43     public void setItems(Set<OrderItem> items) {   
44         this.items = items;   
45     }   
46        
47          /**   
48            *該方法用於向order中加order項   
49           /*   
50     public void addOrderItem(OrderItem orderItem){   
51         orderItem.setOrder(this);//用關系維護端來維護關系   
52         this.items.add(orderItem);   
53     }   
54   
55 }  

訂單項的實體類

 1 import javax.persistence.CascadeType;   
 2 import javax.persistence.Column;   
 3 import javax.persistence.Entity;   
 4 import javax.persistence.GeneratedValue;   
 5 import javax.persistence.Id;   
 6 import javax.persistence.JoinColumn;   
 7 import javax.persistence.ManyToOne;   
 8   
 9 @Entity  
10 public class OrderItem {   
11     private Integer id;   
12     private String productName;   
13     private Float sellPrice = 0f;   
14     private Order order;   
15   
16     @Id  
17     @GeneratedValue  
18     public Integer getId() {   
19         return id;   
20     }   
21   
22     public void setId(Integer id) {   
23         this.id = id;   
24     }   
25   
26     @Column(length = 40, nullable = false)   
27     public String getProductName() {   
28         return productName;   
29     }   
30   
31     public void setProductName(String productName) {   
32         this.productName = productName;   
33     }   
34   
35     @Column(nullable = false)   
36     public Float getSellPrice() {   
37         return sellPrice;   
38     }   
39   
40     public void setSellPrice(Float sellPrice) {   
41         this.sellPrice = sellPrice;   
42     }   
43   
44     @ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH }, optional = true)   
45     @JoinColumn(name="order_id")//這里設置JoinColum設置了外鍵的名字,並且orderItem是關系維護端   
46     public Order getOrder() {   
47         return order;   
48     }   
49   
50     public void setOrder(Order order) {   
51         this.order = order;   
52     }   
53   
54 }  

下面看看測試類

 1 import javax.persistence.EntityManager;   
 2 import javax.persistence.EntityManagerFactory;   
 3 import javax.persistence.Persistence;   
 4   
 5 import org.junit.BeforeClass;   
 6 import org.junit.Test;   
 7   
 8 import cn.itcast.bean.Order;   
 9 import cn.itcast.bean.OrderItem;   
10   
11 public class OneToManyTest {   
12   
13     @BeforeClass  
14     public static void setUpBeforeClass() throws Exception {   
15     }   
16     @Test public void addOrder(){   
17          EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");   
18          EntityManager em = factory.createEntityManager();   
19          em.getTransaction().begin(); // start transaction   
20             
21                    Order order = new Order();    
22          order.setAmount(34f);    
23          order.setOrderid("00001");   
24                       
25                    //order中包含的OrderItem項OrderItem1,OrderItem2   
26          OrderItem orderItem1 = new OrderItem();   
27          orderItem1.setProductName("書");   
28          orderItem1.setSellPrice(22f);   
29          order.addOrderItem(orderItem1); //add orderitem in order   
30             
31          OrderItem orderItem2 = new OrderItem();   
32          orderItem2.setProductName("籃球");   
33          orderItem2.setSellPrice(100f);   
34          order.addOrderItem(orderItem2);   
35             
36          em.persist(order); //persist order object   
37          em.getTransaction().commit(); //commit transaction   
38          em.close();   
39          factory.close();   
40     }   
41 }  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM