hibernate一对多关联映射学习小结

所属分类: 软件编程 / java 阅读数: 25
收藏 0 赞 0 分享

一对多关联映射 

映射原理 

      一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。 

多对一和一对多的区别

  多对一和一对多的区别在于维护的关系不同:

(1)多对一:多端维护一端的关系,在加载多端时,可以将一端加载上来。

(2)一对多:一端维护多端的关系,在加载一端时,可以将多端加载上来。 

分类

一对多单向关联映射 

对象模型      

    

      从对象模型中,我们可以看出,Group持有User的一个引用。由于是单向关联,所以数据在加载Group时,会把User加载上来,但是User并不知道Group的存在。

       我们先看一下Group和User的实体,以及映射文件。

Group

package com.bjpowernode.hibernate; 
import java.util.Set; 
public class Group { 
 private int id; 
 private String name; 
 private Set users; 
  
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
 public Set getUsers() { 
  return users; 
 } 
 public void setUsers(Set users) { 
  this.users = users; 
 } 
} 

User

package com.bjpowernode.hibernate; 
public class User { 
 private int id; 
 private String name; 
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
} 

User.hbm.xml

<?xml version=1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
 <class name="com.bjpowernode.hibernate.User" table="t_user"> 
  <id name="id"> 
   <generator class="native"/> 
  </id> 
  <property name="name"/> 
 </class> 
</hibernate-mapping> 

Group.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
 <class name="com.bjpowernode.hibernate.Group" table="t_group"> 
  <id name="id"> 
   <generator class="native"/> 
  </id> 
  <property name="name"/> 
  <!-- users属性,表达的是本对象与User的一对多的关系 --> 
  <set name="users"> 
    <!--当前表(Group)的主键--> 
   <key column="groupid"/> 
   <one-to-many class="com.bjpowernode.hibernate.User"/> 
  </set> 
 </class> 
</hibernate-mapping> 

生成的表结构和测试数据

缺点 

1)因为多端User不知道Group的存在(也就是User不维护与Group的关系),所以在保存User时,关系字段groupId为null,如果该字段设置为非空,则将无法保存数据。

2)因为User不维护关系,而Group维护关系,Group就会发出多余的update语句,保证Group和User有关系,这样加载Group时才把该Users对应的用户加载上来。 

一对多双向关联映射

对象模型       

  

        双向关联映射对比单向关联映射,对象的加载方向由单向变成了双向。 

我们看一下Group和User的实体,映射文件

Group

package com.bjpowernode.hibernate; 
import java.util.Set; 
public class Group { 
 private int id; 
 private String name; 
 private Set users; 
 
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
 public Set getUsers() { 
  return users; 
 } 
 public void setUsers(Set users) { 
  this.users = users; 
 } 
} 

User

package com.bjpowernode.hibernate; 
public class User { 
 private int id; 
 private String name; 
 private Group groups; 
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
 public Group getGroups() { 
  return groups; 
 } 
 public void setGroups(Group groups) { 
  this.groups = groups; 
 } 
} 

Group.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="com.bjpowernode.hibernate"> 
 <class name="Group" table="t_group"> 
  <id name="id"> 
   <generator class="native"/> 
  </id> 
  <property name="name"/> 
  <!-- 影响控制反转:inverse="false",多的一端维护关系,让一的一端失效 --> 
  <set name="users" inverse="true"> 
   <key column="groupid" not-null="true"/> 
   <one-to-many class="User"/> 
  </set> 
 </class> 
</hibernate-mapping> 

User.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="com.bjpowernode.hibernate"> 
 <class name="User" table="t_user"> 
  <id name="id"> 
   <generator class="native"/> 
  </id> 
  <property name="name"/> 
  <!-- groups属性,表达的是本对象与Group的多对一的关系 --> 
  <many-to-one name="groups" class="Group" column="groupid"/> 
 </class> 
</hibernate-mapping> 

生成的表和测试数据 

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

 1)在一的一端的集合上采用<key>标签,在多的一端加入一个外键

 2)在多的一端采用<many-to-one>标签

注意:<key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱。

inverse属性:

         inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效,所以设置为inverse为true。

注意:inverse属性,只影响数据的存储,也就是持久化。 

目的 

       一对多双向关联映射的目的主要是为了解决一对多单向关联的缺陷而不是需求驱动的。

总结

以上所述是小编给大家介绍的hibernate一对多关联映射学习小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多