首页 > 其他分享 >JPA的一对多映射(单向)

JPA的一对多映射(单向)

时间:2023-03-27 22:02:28浏览次数:37  
标签:name 映射 JPA 单向 public id import javax persistence


 


JPA的一对多映射(单向)

Posted on 

  CN.programmer.Luxh 


JPA的一对多映射(单向)_数据库

  注意:这里说的是一对多的单向关联,不是一对多的双向关联。

  实体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的一对多单向映射。

JPA的一对多映射(单向)_一对多_02

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

JPA的一对多映射(单向)_java_03


  第二种方式,通过在多方(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。

JPA的一对多映射(单向)_数据库_04

  再看book表的结构,会多了一列author_id。

JPA的一对多映射(单向)_java_05

 

标签:name,映射,JPA,单向,public,id,import,javax,persistence
From: https://blog.51cto.com/u_16034393/6153300

相关文章

  • Winform/Csharp中使用Linq的Where条件筛选、Select字段映射(左外连接并设置无匹配时默
    场景Java8新特性-Stream对集合进行操作的常用API:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657上面讲的是在Java中使用Stream中对集合的常用操......
  • jpa修改操作执行完了,也没报错,但是数据没有进行修改
    查询操作正常、修改就不生效看一下是不是重新创建了一个新的事务、导致数据更新了没有进行事务提交@Primary@Bean(name=TRANSACTION_MANAGER_NAME)public......
  • 关于mybatis创建的mapper映射路径不对导致的系列报错
    今天在写mybatis项目的时候,使用注解发现无法使用别名,添加ResultMap的时候直接报错显示无法解析。经过百度了好久也是成功的发现了问题的所在,就是这个:这个路径创建的时候......
  • mybatis的resultMap部分映射字段失败
    出现这种情况,一般是sql语句多表查询时,返回的字段出现重复情况,比如a对象分别有handle_status属性,和b嵌套对象,但是b对象里面也有handle_status属性,两张表进行关联查询,并且要......
  • Josephu问题与单向环形链表
    Josephu问题与单向环形链表1.什么是约瑟夫问题(Josephu)Josephu问题的设定为:假设编号为1,2,...,n的n个人围坐成一圈,从编号为k(1≤k≤n)的人开始报数,当报至m时报m的这个人出......
  • 视差映射
    视差映射ParallaxMapping 主要为了赋予模型表面遮挡关系的细节。引入了一张高度图可以和法线贴图一起使用,来产生一些真实的效果高度图一般视为顶点位移来使用,此时......
  • 【JPA】@Modifying 注解
    工作中看到JPA中有一个@Modifying的用法,故此记录一下JDK1.8Springboot2JPAOracle 之前一直用的是这样的写法:StringupdateQuery="UPDATEuserSETname=:name......
  • Winform/Csharp中连接Mysql并执行指定sql,查询结果通过反射映射为对象的List
    场景Winform中连接Mysql8并查询表中数据进行显示:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/120395988在上面连接Mysql的基础上,如果需要连接Mysql并执......
  • 分页机制及映射过程
    分页机制和映射过程x86:CR3-PDT-PTT-offset10-10-12x86withPAE:CR3-PDPT-PDT-PTT-offset2-9-9-12EPT(x64):EPTP-PML4E-PDPTE-PDE-PTE-o......
  • ddr控制-axi4映射到altera-uniPHY
    原始资料参考《emi_ddr_ug》,暂未下载到,故未粘贴datasheet原图。local_size:burst读写的最大数据数量。通常IP核内部有FIFO用于支持这样的连续数据读写,在Megafunction......