JPA的一对多映射(单向)
2012-05-27 17:23
134 查看
注意:这里说的是一对多的单向关联,不是一对多的双向关联。
实体Author:作者。
实体Book:作者写的书。
Author和Book是一对多的关系。
在JPA中,用@OneToMany来标识一对多的关系。实现一对多的单向关联,只需在代表一的实体(Author)中使用@OneToMany映射标注就可以了,代表多的实体不需要使用任何映射标注。
有两种方式实现一对多的单向关联。一种是在只使用@OneToMany来标识,这种方式是通过一张第三方表来保存关系。还有一种是使用@OneToMany和@JoinColumn来标注,这种方式是在多的一方(Book)的表中增加一个外键列来保存关系。
第一种方式,通过一张第三方表来实现一对多的单向关联:
Author.java如下,需要注意private Set<Book> books = new HashSet<Book>()的注解。只是使用了@OneToMany。
Book.java如下,因为是单向的关联,所以这个实体不需要加任何的关联标识。
只在Author实体中对private Set<Book> books = new HashSet<Book>()加上标注@OneToMany实现单向关联。这样就通过一个关联表来实现这种关联。生成数据库表如下,会以Author的表名和下划线和Book的表名生成一张表author_book来保存Author和Book的一对多单向映射。
![](http://pic002.cnblogs.com/images/2012/408749/2012052716455488.jpg)
在author_book表中,存的是Auhtor的id和Book的id:
![](http://pic002.cnblogs.com/images/2012/408749/2012052716515990.jpg)
第二种方式,通过在多方(Book)的表中增加一个外键列实现一对多的单向关联。
Author.java如下,需要注意private Set<Book> books = new HashSet<Book>()的注解。同时使用了@OneToMany和@JoinColumn。
Book.java不变。
在数据库中只生成了两张表:author和book。
![](http://pic002.cnblogs.com/images/2012/408749/2012052717144068.jpg)
再看book表的结构,会多了一列author_id。
实体Author:作者。
实体Book:作者写的书。
Author和Book是一对多的关系。
在JPA中,用@OneToMany来标识一对多的关系。实现一对多的单向关联,只需在代表一的实体(Author)中使用@OneToMany映射标注就可以了,代表多的实体不需要使用任何映射标注。
有两种方式实现一对多的单向关联。一种是在只使用@OneToMany来标识,这种方式是通过一张第三方表来保存关系。还有一种是使用@OneToMany和@JoinColumn来标注,这种方式是在多的一方(Book)的表中增加一个外键列来保存关系。
第一种方式,通过一张第三方表来实现一对多的单向关联:
Author.java如下,需要注意private Set<Book> books = new HashSet<Book>()的注解。只是使用了@OneToMany。
package com.cndatacom.jpa.entity; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; /** * 作者 * @author Luxh */ @Entity @Table(name="author") public class Author { @Id @GeneratedValue private Long id; /**作者的名字*/ @Column(length=32) private String name; /**作者写的书*/ @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)//级联保存、更新、删除、刷新;延迟加载 private Set<Book> books = new HashSet<Book>(); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Book> getBooks() { return books; } public void setBooks(Set<Book> books) { this.books = books; } }
Book.java如下,因为是单向的关联,所以这个实体不需要加任何的关联标识。
package com.cndatacom.jpa.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; /** * 书 * @author Luxh */ @Entity @Table(name="book") public class Book { @Id @GeneratedValue private Long id; /**书名*/ @Column(length=32) private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
只在Author实体中对private Set<Book> books = new HashSet<Book>()加上标注@OneToMany实现单向关联。这样就通过一个关联表来实现这种关联。生成数据库表如下,会以Author的表名和下划线和Book的表名生成一张表author_book来保存Author和Book的一对多单向映射。
![](http://pic002.cnblogs.com/images/2012/408749/2012052716455488.jpg)
在author_book表中,存的是Auhtor的id和Book的id:
![](http://pic002.cnblogs.com/images/2012/408749/2012052716515990.jpg)
第二种方式,通过在多方(Book)的表中增加一个外键列实现一对多的单向关联。
Author.java如下,需要注意private Set<Book> books = new HashSet<Book>()的注解。同时使用了@OneToMany和@JoinColumn。
package com.cndatacom.jpa.entity; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.Table; /** * 作者 * @author Luxh */ @Entity @Table(name="author") public class Author { @Id @GeneratedValue private Long id; /**作者的名字*/ @Column(length=32) private String name; /**作者写的书*/ @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)//级联保存、更新、删除、刷新;延迟加载 @JoinColumn(name="author_id")//在book表增加一个外键列来实现一对多的单向关联 private Set<Book> books = new HashSet<Book>(); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Book> getBooks() { return books; } public void setBooks(Set<Book> books) { this.books = books; } }
Book.java不变。
在数据库中只生成了两张表:author和book。
![](http://pic002.cnblogs.com/images/2012/408749/2012052717144068.jpg)
再看book表的结构,会多了一列author_id。
![](http://pic002.cnblogs.com/images/2012/408749/2012052717155022.jpg)
相关文章推荐
- Sping Data Jpa 一对多单向映射
- JPA-映射单向多对一的关联关系
- JPA的一对多映射(单向)
- JPA-映射单向一对多的关联关系
- JPA 映射单向多对一的关联关系
- jpa单向一对多关联映射
- 6、JPA_映射单向多对一的关联关系(n的一方有1的引用,1的一方没有n的集合属性)
- JPA中one-to-one关系的单向映射示例
- jpa单向一对一关系外键映射
- jpa单向多对多关联映射
- JPA的一对多映射(单向)
- JPA学习笔记-映射单向多对一的关联关系
- JPA中one-to-one关系的单向映射示例
- JPA学习笔记-映射单向一对多的关联关系
- jpa单向多对一关联映射
- JPA多对一关(单向和双向)联映射实验
- JPA学习笔记-映射单向多对一的关联关系
- JPA学习笔记-映射单向一对多的关联关系
- JPA 进阶 继承映射
- 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)