你的位置:首页 > Java教程

[Java教程]hibernate学习笔记(四)


  学习hibernate很关键的一个地方就是关联映射,今天我们来扒啦扒拉hibernate映射关系中的多对一单向和一对多单向。

  首先来说一下多对一单向,也就是N-->1,多对一的例子在生活中还是很常见的吧,比如多个人住在一个地方,多个学生在一个班级,所谓的多对一就是通过多的一方能够找到

一得一方,既然是单向的,那么肯定是一是找不到多的,什么意思呢?就是知道张三是一年级一班的,但是不知道一年级一班有张三这个人,如果我非要知道怎么办呢?凉拌呗,这个。。开个玩笑啊,如果想通过班级知道学生,那么肯定的是双向的,或者是一对多单向的。下面通过地址和人员的例子说一下单向多对一的关系:

既然是hibernate,那么肯定要有实体类了,我是采用注解的方式实现的,首先是人员的实体类,也就是多的一段,下面上图:

下面是对应的set/get方法,我就不再详细说了,注解的意思里面注释也有,也不再赘述。

下面是地址对应的实体类。

由于是多对一单向的,所以在一得一端不必做过多的设置,只需要把实体类需要的基本属性给了就可以了。

然后我们来做个测试,工具是JUNIT4,不废话,上图:

运行的结果是什么呢?我们可以看一下:

 

我们可以看到ibernate向数据库中添加了两条地址信息,然后修改人员表的地址信息。有人会说你这里是你这里分别执行了session.persist(a);和session.persist(a1);才保存成功,那我想直接保存一个人员的时候就把地址给保存进去,那么怎么办呢?按照上面的配置也是可以实现的哦,

在这我把这两个保存地址的给注释掉了,运行结果怎么样呢?

我们可以看到运行结果是一模一样的哦,这是因为有了@Cascade(org.hibernate.annotations.CascadeType.ALL)这个配置,如果把这个去掉可是会报错的,具体的看下:

可以看到JUNIT报错了,具体的意思就是在非空的属性指向个瞬时的对象,瞬时的 对象必须保存在这个操作中。主要就是cascade的作用了,cascade有五个属性值,分别对应不同的操作,大家看一下就可以了。

上面的操作是在人员的表中添加一个地址的ID字段,不会再生成一个第三方表,如果想生成第三方表怎么设置呢?

其他的操作没什么不同的,下面上图:

注释上说的也差不多了,大家也可以采用配置文件的方式来写,本来想一对多单向和多对一单向一起说的,但是这个太长了,再开一个来写一对多单向的,这篇暂时就这样了。