继上篇博客

一对多关联映射(单向)

上面我们介绍了多对一,我们反过来看一对多不就是多对一吗?那还用再进行不同的映射吗?有什么区别吗?一对多和多对一映射原理是一致的,存储是同样的。也就是生成的数据库的表是一样的。他们之间不同的是维护的关系不同。

他们之间不同点是维护的关系不同

*多对一维护的关系是:多指向一的关系。有了此关系,载入多的时候能够将一载入上来。

*一对多维护的关系是:一指向多的关系。有了此关系,在载入一的时候能够将多载入上来。

一个班级有多个学生,通过班级能够看到学生信息。

Classes的映射关系

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Classes">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="students">
<key column="classesid"/>
<one-to-many class="com.bjpowernode.hibernate.Student"/>
</set>
</class>
</hibernate-mapping>

Student的映射关系

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
</class> </hibernate-mapping>

再看保存的代码:给班级设置学生,而由于学生维护关系。就要在学生端保存班级id--会带来什么问题?

public void testSave2(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction(); Student student1=new Student();
student1.setName("张三");
session.save(student1); Student student2=new Student();
student2.setName("李四");
//保存学生
session.save(student2); Classes classes=new Classes();
classes.setName("动力节点"); Set students=new HashSet();
students.add(student1);
students.add(student2); classes.setStudents(students);
session.save(classes);
session.getTransaction().commit(); }catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}

在保存数据时,会存在这么一个时刻:so?带来的问题

1,从班级能看到学生。是班级来维护关系,不是学生来维护关系,学生不知道自己是哪个班。所以在保存学生的时候,班级id不知道。为了更新学生是哪个班级的要发出非常多update语句来告诉学生是哪个班级的。

2。当我们设置classesidnot-null=“true”时,则将无法保存数据,解决的方法我们改为双向关联映射。

一对多关联映射(双向)

为了解决一对多单向可能存在的问题,我们採用双向一对多。每一方都能维护对方。

而不是需求驱动

一对多双向关联映射方式:

*在一的一端的集合上採用<key>标签。在多的一端增加一个外键。

*在多的一端採用<many-to-one>的标签

!~注意<key>标签和<many-to-one>标签增加字段保持一致,否则会产生数据混乱。

Classes映射文件

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Classes">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="students" inverse="true">
<key column="classesid"/>
<one-to-many class="com.bjpowernode.hibernate.Student"/>
</set>
</class>
</hibernate-mapping>

Student映射文件

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<many-to-one name="classes" column="classesid"></many-to-one>
</class>
</hibernate-mapping>

注意:Inverse属性

1、Inverse中文意思为相反的,反转。在hibernate中inverse能够用在一对多和多对多双向关联上,inverse默认是false。为false的时候表示本端能够维护关系,假设inverse为true,则本端不能维护关系。会交给还有一端维护关系。本端失效,所以在一对多关联映射我们通常在多的一端维护关系。让一的一端失效。

2、Inverse是控制方向上的反转,仅仅影响存储。

比較一对多单向和双向映射,从存储结构上看没有什么差别,可是从配置文件上看。一对多双向关联的配置文件里在多的一端的配置文件上存在<many-to-one>相关配置,即保证多对一的映射。

下篇继续。

最新文章

  1. 125个工具与技术(PMBOK2008)
  2. Atitit usrQBK1600 技术文档的规范标准化解决方案
  3. 网络错误定位案例 ICMP host *** unreachable - admin prohibited
  4. Html之head部分详解
  5. CRC-16/XMODE X16+X12+X5+1 C#、C和java环境下实现
  6. python 字符串格式化 输出
  7. POJ2348+博弈
  8. initialize or clean up your unittest within .net unit test
  9. angularJs项目实战!01:模块划分和目录组织
  10. ORACLE表建立自增列
  11. mybatis查询语句获取自增主键
  12. 导入项目报错:Type Java compiler level does not match the version
  13. .Net Discovery系列之十-深入理解平台机制与性能影响(上)
  14. linux 停止对某个端口的监听
  15. STL标准库-迭代器
  16. MongoDB操作数据库的几个命令(自己用)
  17. 栈java实现
  18. 通过自动回复机器人学Mybatis:MySQL脚本 + db &gt;&gt; dao &gt;&gt; service &gt;&gt; servlet
  19. 页面QQ在线咨询、在线交谈代码
  20. poj 1273 裸 网络流 (dinic)

热门文章

  1. JavaScript中的常用的数组操作方法
  2. java缓冲区BufferedReader
  3. HDU 3625
  4. LeetCode211:Add and Search Word - Data structure design
  5. 解题报告 之 HDU5317 RGCDQ
  6. Android This Activity already has an action bar supplied by the window decor
  7. s3c2440的IIC控制
  8. HDU 5296 Annoying problem dfs序 lca set
  9. Linux mount挂载umount卸载
  10. 《剑指offer》二叉搜索树与双向链表