注意:這里說的是一對多的單向關聯,不是一對多的雙向關聯。
實體Author:作者。
實體Book:作者寫的書。
Author和Book是一對多的關系。
在JPA中,用@OneToMany來標識一對多的關系。實現一對多的單向關聯,只需在代表一的實體(Author)中使用@OneToMany映射標注就可以了,代表多的實體不需要使用任何映射標注。
有兩種方式實現一對多的單向關聯。一種是在只使用@OneToMany來標識,這種方式是通過一張第三方表來保存關系。還有一種是使用@OneToMany和@JoinColumn來標注,這種方式是在多的一方(Book)的表中增加一個外鍵列來保存關系。
第一種方式,通過一張第三方表來實現一對多的單向關聯:
Author.java如下,需要注意private Set<Book> books = new HashSet<Book>()的注解。只是使用了@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<Book> books = new HashSet<Book>()加上標注@OneToMany實現單向關聯。這樣就通過一個關聯表來實現這種關聯。生成數據庫表如下,會以Author的表名和下划線和Book的表名生成一張表author_book來保存Author和Book的一對多單向映射。

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

第二種方式,通過在多方(Book)的表中增加一個外鍵列實現一對多的單向關聯。
Author.java如下,需要注意private Set<Book> books = new HashSet<Book>()的注解。同時使用了@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。

