前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Java从入门到放弃》框架入门篇:hibernate中的多表对应关系

《Java从入门到放弃》框架入门篇:hibernate中的多表对应关系

作者头像
十方上下
发布2018-06-14 10:53:17
7340
发布2018-06-14 10:53:17
举报
文章被收录于专栏:学习力

hibernate中的对应关系其实就是数据库中表的对应关系,

就跟某些电影中的某些场景是一样一样滴。

比如可以是一男一女,还可以是一男多女,

更可以是多男一女,最后最后最后还可以是多男多女!!!

有些不纯洁的看官肯定已经开始想歪了吧···,我还是上图吧!请看下图

wKioL1mWqsDitpk7AAXuWbYevXs133.png
wKioL1mWqsDitpk7AAXuWbYevXs133.png

我说滴是这样滴一群人打群架滴场景,嘿嘿嘿···

好吧,进入正题!!!

数据库中表与表之间的数据映射关系有一对一,一对多,多对一,多对多。例如:

一个身份证只能对应一个护照,一个护照也只能对应一个身份证,这就是一对一的关系

一个男人可以有多个孩子,这多个孩子只能对应一个爹,从男人的角度这就是一对多的关系,而从孩子的角度,那就是多对一的关系

一个用户可以买多件不同的商品,而某个商品也可以被多个用户购买,这就是多对多的关系,一般多对多的关系,我们会再创建一个关系表来保存这种关联,所以最后这三张表的关系就会变成两个一对多的关系。

如果有不清楚的小伙伴,建议先学习一下数据库再来继续。

在实际开发中,用得最多的就是一对多和多对一,今天我们就来说说在hibernate中如何还配置这两种关系。

一、一对多映射关系

我这儿举的例子是个简化版的博客数据库,里面有三张表,分别是:作者表、博客表、评论表。

wKiom1mWriGTwozqAABXRkNB7Is272.png
wKiom1mWriGTwozqAABXRkNB7Is272.png
wKioL1mWrh7S4j5VAACII-K9O2o782.png
wKioL1mWrh7S4j5VAACII-K9O2o782.png
wKiom1mWriKwFnTHAAAd47JNMNE737.png
wKiom1mWriKwFnTHAAAd47JNMNE737.png

因为是入门篇哈,所以表的结构进行了简化,对应关系就是:一个作者可以有多个博客,一个博客可以有多个评论。

现在我们要实现这个一个需求:查询作者,并且同时查询出他的所有博客。

1.1) 首先,使用DBBrowser来生成作者表和博客表对应的实体类和映射文件。

wKiom1mWrzDCjxAzAADVuGaiHHg403.png
wKiom1mWrzDCjxAzAADVuGaiHHg403.png

    注意勾选下面的a<-b,因为我是在author表上点的右键来生成,勾上这个选项就表示所有引用了author表的外键表都会关联生成。

生成的author实体类就会多出一个SET集合。

wKiom1mWsBOzGHAeAABJ5mKGYaw607.png
wKiom1mWsBOzGHAeAABJ5mKGYaw607.png

我们手工把它改成泛型集合。

author的映射文件中也会多出一个SET标签。

wKioL1mWsKvCmbEkAABKTwmu5ss109.png
wKioL1mWsKvCmbEkAABKTwmu5ss109.png

1.2)这儿我们先不做修改,然后在Test类中编写测试代码:

代码语言:javascript
复制
public class Test {
    public static void main(String[] args) {

        Session session = HibernateSessionFactory.getSession();

        Author author = (Author)session.get(Author.class, 1);
        System.out.println("看SQL语句是在我之前还是之后!");
        System.out.println("作者:"+author.getUsername());
        //遍历该作者的所有博客
        for (Blog blog : author.getBlogs()) {
            System.out.println("博客:"+blog.getTitle());
        }
        
        HibernateSessionFactory.closeSession();
    }
}

可以看到运行后的结果如下所示:

wKiom1mWsdPRxrhUAABzDRDxOgw448.png
wKiom1mWsdPRxrhUAABzDRDxOgw448.png

从上面可以看到,虽然我们只是get了一个author对象,但在使用它内部的blog对象时,hibernate会自动去查询该作者的所有博客,是不是非常方便,比我们自己写JDBC的代码要简单很多了吧!!!

马上要回家了,今天先讲到这儿吧·,看官们自己还有时间的话,可以再试试多对一的映射,如果都没问题的话,后面还有几个属性要简单介绍一下的:lazy、cascade、not-null、inverse、fetch。

好了,今天就到这儿吧!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/08/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档