1. 程式人生 > >JPA的一對多對映(單向)

JPA的一對多對映(單向)

注意:這裡說的是一對多的單向關聯,不是一對多的雙向關聯。

  實體Author:作者。

  實體Book:作者寫的書。

  Author和Book是一對多的關係。

  在JPA中,用@OneToMany來標識一對多的關係。實現一對多的單向關聯,只需在代表一的實體(Author)中使用@OneToMany對映標註就可以了,代表多的實體不需要使用任何對映標註。

  有兩種方式實現一對多的單向關聯。一種是在只使用@OneToMany來標識,這種方式是通過一張第三方表來儲存關係。還有一種是使用@OneToMany和@JoinColumn來標註,這種方式是在多的一方(Book)的表中增加一個外來鍵列來儲存關係。

  第一種方式,通過一張第三方表來實現一對多的單向關聯:

  Author.java如下,需要注意private Set books = new HashSet()的註解。只是使用了@OneToMany。

複製程式碼
 1 package com.cndatacom.jpa.entity;
 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.FetchType; 10 import javax.persistence.GeneratedValue; 11 import javax.persistence.Id; 12 import javax.persistence.OneToMany; 13 import javax.persistence.Table; 14 15 16 /** 17 * 作者 18 * @author Luxh 19 */ 20 21 @Entity 22 @Table(name="author"
) 23 public class Author { 24 25 @Id 26 @GeneratedValue 27 private Long id; 28 29 /**作者的名字*/ 30 @Column(length=32) 31 private String name; 32 33 /**作者寫的書*/ 34 @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)//級聯儲存、更新、刪除、重新整理;延遲載入 35 private Set<Book> books = new HashSet<Book>(); 36 37 38 39 public Long getId() { 40 return id; 41 } 42 43 44 public void setId(Long id) { 45 this.id = id; 46 } 47 48 49 public String getName() { 50 return name; 51 } 52 53 54 public void setName(String name) { 55 this.name = name; 56 } 57 58 59 public Set<Book> getBooks() { 60 return books; 61 } 62 63 64 public void setBooks(Set<Book> books) { 65 this.books = books; 66 } 67 68 69 70 71 } 複製程式碼   

  Book.java如下,因為是單向的關聯,所以這個實體不需要加任何的關聯標識。

複製程式碼
 1 package com.cndatacom.jpa.entity;
 2 
 3 import javax.persistence.Column;
 4 import javax.persistence.Entity;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.Id;
 7 import javax.persistence.Table;
 8 
 9 /**
10  * 書
11  * @author Luxh
12  */
13 
14 @Entity
15 @Table(name="book")
16 public class Book {
17     
18     @Id
19     @GeneratedValue
20     private Long id;
21     
22     /**書名*/
23     @Column(length=32)
24     private String name;
25     
26     public Long getId() {
27         return id;
28     }
29 
30     public void setId(Long id) {
31         this.id = id;
32     }
33 
34     public String getName() {
35         return name;
36     }
37 
38     public void setName(String name) {
39         this.name = name;
40     }
41 
42     
43 }
複製程式碼

  只在Author實體中對private Set books = new HashSet()加上標註@OneToMany實現單向關聯。這樣就通過一個關聯表來實現這種關聯。生成資料庫表如下,會以Author的表名和下劃線和Book的表名生成一張表author_book來儲存Author和Book的一對多單向對映。

這裡寫圖片描述

  在author_book表中,存的是Auhtor的id和Book的id:

這裡寫圖片描述

  第二種方式,通過在多方(Book)的表中增加一個外來鍵列實現一對多的單向關聯。

  Author.java如下,需要注意private Set books = new HashSet()的註解。同時使用了@OneToMany和@JoinColumn。

複製程式碼
 1 package com.cndatacom.jpa.entity;
 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.FetchType;
10 import javax.persistence.GeneratedValue;
11 import javax.persistence.Id;
12 import javax.persistence.JoinColumn;
13 import javax.persistence.OneToMany;
14 import javax.persistence.Table;
15 
16 
17 /**
18  *  作者
19  * @author Luxh
20  */
21 
22 @Entity
23 @Table(name="author")
24 public class Author {
25     
26     @Id
27     @GeneratedValue
28     private Long id;
29     
30     /**作者的名字*/
31     @Column(length=32)
32     private String name;
33     
34     /**作者寫的書*/
35     @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)//級聯儲存、更新、刪除、重新整理;延遲載入
36     @JoinColumn(name="author_id")//在book表增加一個外來鍵列來實現一對多的單向關聯
37     private Set<Book> books = new HashSet<Book>();
38     
39     
40     
41     public Long getId() {
42         return id;
43     }
44 
45 
46     public void setId(Long id) {
47         this.id = id;
48     }
49 
50 
51     public String getName() {
52         return name;
53     }
54 
55 
56     public void setName(String name) {
57         this.name = name;
58     }
59 
60 
61     public Set<Book> getBooks() {
62         return books;
63     }
64 
65 
66     public void setBooks(Set<Book> books) {
67         this.books = books;
68     }
69 
70 
71     
72     
73 }
複製程式碼

  Book.java不變。

  在資料庫中只生成了兩張表:author和book。

這裡寫圖片描述

  再看book表的結構,會多了一列author_id。

這裡寫圖片描述