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。