Spring Data JPA中常见的关系映射之一对多关系
2017-07-01 本文已影响0人
Renky

今天由于时间的关系,我们就简单的介绍下Spring Data JPA中常见的关系映射~!
首先我们先建立一个实体类Book类,然后在这个Book里面添加id,name,category变量,并生成他们的get和set方法。

由于一本书可以属于多个门类,所以category对应book的话应该是ManyToOne的关系所以我们在变量category前加个ManyToOne这个注解,来说明book和category的关系。

然后我们来运行一下程序在看看数据库!

然后我们可以看见数据库中book实体类所对应的边xhysc_book里面生成了一个xhysc_category_xhysc_id这个外键。

然后我们再看看category实体类所对应的边xhysc_category中并没有生成外键,所以这就证明这是一个单行连接,也就是我们可以根据book查询到它所对应的category,而无法在category中找到category所以关联的book!

接下来我们来实现ManyToOne中的双向关系!
很简单,我们只需要在category实体类中说明一个类型为book的List集合,然后为它添加注解@OneToMany,因为book对应category为ManyToOne,所以category对应book应该为OneToMany!

然后我们运行程序,查看我们数据库,发现数据库多出了一张表,表名为xhysc_xhysc_category_xhysc_book,里面有两个字段分别为xhysc_category_xhysc_id和xhysc_books_xhysc_id,其实是因为程序自动新建了一张表把book实体类和category实体类所对应的数据库边的主键id关联了起来!

但是这貌似并不是我们想要的结果,这因为我们两个实体类都说明了映射关系,他们就各自维护了自己的关系。所以我们要在Category实体类中books变量的注解后面加上@OneToMany(mappedBy = "category"),意思就是我们的关系维护不再有我们的单方Category实体类来维护,而是由我们的多方Book实体类来维护!

然后我们在运行程序,查看我们的数据库!

最终我们看到了我们想要的结果,就是book实体类对应的数据库边生成了category实体类表的外键,实现了一本书对应一个门类,但是一个门类却可以对应多本书这个需求。
最后附件一个小实践,就我们对应多方的实体类注解@ManyToOne后可以添加一些控制!

fetch是控制我们在查询book类的时候时候把当前book类下的category也查询出来,其中这里有两个策略,一个是EAGER也就是马上加载,一个是LAZY也就是不加载的方式。而默认的方式是为EAGER!

optional是表示我们的外键是否可以为空,默认的选项是true的,在没有声明optional下,我们的书是可以不属于任何一个门类的。

而在我们OneToMany这方也有几个属性可以选择的!例如cascade =CascadeType.REMOVE表示的就是当我们删除这个门类的时候,它时候也会把book中剩余这个门类的信息删除!
orphanRemoval = true表示当我们操作集合的时候使用集合中的removed方法removed一个元素的时候是否同步数据库把数据库中的信息也删除了!
targetEntity是操作泛型的由于用得比较少,这里就不一一解析了啦!
今天就讲到这里啦~~~!