`

[SXT][WY]Hibernate05 多对一及一对一关联映射

阅读更多

many-to-one

 

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.bjsxt.hibernate.Group" table="t_group">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
 </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>
 <class name="com.bjsxt.hibernate.User" table="t_user">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <!--
  <many-to-one name="group" column="groupid" cascade="all"/>
   -->
   <many-to-one name="group" column="groupid"/>
 </class>
</hibernate-mapping>

public void testSave1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Group group = new Group();
   group.setName("尚学堂");
   
   User user1 = new User();
   user1.setName("菜10");
   user1.setGroup(group);
   
   User user2 = new User();
   user2.setName("容祖儿");
   user2.setGroup(group);
   
   //不能成功保存,抛出TransientObjectException异常
   //因为Group为Tran sient状态,oid没有分配值
   //persistent状态的对象是不能引用transient状态的对象的
   session.save(user1);
   session.save(user2);
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }

public void testSave2() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Group group = new Group();
   group.setName("尚学堂");
   
   session.save(group);
   
   User user1 = new User();
   user1.setName("菜10");
   user1.setGroup(group);
   
   User user2 = new User();
   user2.setName("容祖儿");
   user2.setGroup(group);
   
   //可以正确存储
   session.save(user1);
   session.save(user2);
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 } 

public void testSave3() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Group group = new Group();
   group.setName("尚学堂");
   
   User user1 = new User();
   user1.setName("菜10");
   user1.setGroup(group);
   
   User user2 = new User();
   user2.setName("容祖儿");
   user2.setGroup(group);
   
   //不会抛出异常,因为采用了cascade属性,所以它会先保存Group
   //采用cascade属性是解决TransientObjectException异常的一种手段   
   session.save(user1);
   session.save(user2);
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 } 

public void testLoad1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   User user = (User)session.load(User.class, 3);
   System.out.println("user.name=" + user.getName());
   System.out.println("user.group.name=" + user.getGroup().getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }  

 

 

hibernate一对一主键关联映射(单向关联Person---->IdCard)

一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建

具体映射:

 <id name="id">
  <!-- person的主键来源idCard,也就是共享idCard的主键 -->
  <generator class="foreign">
   <param name="property">idCard</param>
  </generator>
 </id>
 <property name="name"/>
 <!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
 constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard 
  -->
 <one-to-one name="idCard" constrained="true"/>

IdCard.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.bjsxt.hibernate.IdCard" table="t_idcard">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="cardNo"/>
 </class>
</hibernate-mapping>

Person.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.bjsxt.hibernate.Person" table="t_person">
  <id name="id">
   <generator class="foreign">
    <param name="property">idCard</param>
   </generator>
  </id>
  <property name="name"/>
  <one-to-one name="idCard" constrained="true"/>
 </class>
</hibernate-mapping>

 

public void testSave1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   IdCard idCard = new IdCard();
   idCard.setCardNo("88888888888888");
   
   Person person = new Person();
   person.setName("菜10");
   person.setIdCard(idCard);
   
   //不会出现TransientObjectException异常
   //因为一对一主键关联映射中,默认了cascade属性
   session.save(person);
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }  

 

public void testLoad1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   User user = (User)session.load(User.class, 3);
   System.out.println("user.name=" + user.getName());
   System.out.println("user.group.name=" + user.getGroup().getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 } 

 

hibernate一对一主键关联映射(双向关联Person<---->IdCard)

 

IdCard.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.bjsxt.hibernate.IdCard" table="t_idcard">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="cardNo"/>
  <one-to-one name="person"/>
 </class>
</hibernate-mapping>

 

 

public void testLoad2() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   IdCard idCard = (IdCard)session.load(IdCard.class, 1);
   System.out.println("idcard.cardNo=" + idCard.getCardNo());
   System.out.println("idcard.person.name=" + idCard.getPerson().getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }  

 

 

hibernate一对一唯一外键关联映射(单向关联Person---->IdCard)

 

一对一唯一外键关联映射是多对一关联映射的特例

可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
通过这种手段映射一对一唯一外键关联

 

Person.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.bjsxt.hibernate.Person" table="t_person">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <many-to-one name="idCard" unique="true"/>
 </class>
</hibernate-mapping>

 

public void testSave1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   IdCard idCard = new IdCard();
   idCard.setCardNo("88888888888888");
   
   Person person = new Person();
   person.setName("菜10");
   person.setIdCard(idCard);
   
   //不能成功保存,因为IdCard是Transient状态
   session.save(person);
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }  
 
 public void testSave2() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   IdCard idCard = new IdCard();
   idCard.setCardNo("88888888888888");
   session.save(idCard);
   
   Person person = new Person();
   person.setName("菜10");
   person.setIdCard(idCard);
   // 成功
   session.save(person);
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }   
 public void testLoad1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   // 成功
   Person person = (Person)session.load(Person.class, 2);
   System.out.println("person.name=" + person.getName());
   System.out.println("idCard.cardNo=" + person.getIdCard().getCardNo());
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }  

 

hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)

 


一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载
其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,
所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射方式:
<one-to-one name="person" property-ref="idCard"/>

分享到:
评论

相关推荐

    mikrotik SXT 网桥点对点安装

    安装和配置mikrotik SXT网桥进行点对点连接,涉及多个步骤,首先要了解使用的硬件设备,本例中使用的是SXT Lite 2型号的无线网桥设备。接下来是一系列配置操作,包括: 1. 移除默认配置:在开始配置之前,首先需要...

    SXT--RBAC权限控制系统源码

    源码可能包含ORM(对象关系映射)框架的使用,如Hibernate或MyBatis,以及SQL查询语句。 通过分析SXT--RBAC权限控制系统的源码,我们可以深入了解RBAC模型的实现细节,如何有效地进行权限管理,以及如何确保系统的...

    sxt Video File

    在【描述】中提到的“所有下载文档比较全,开发方便用”,意味着该压缩包可能包含了关于sxt文件格式的详细技术文档,对开发者来说是一份宝贵的资源。 sxt文件格式可能采用了先进的视频编码技术,如H.264、HEVC...

    sxt.rar_sxt

    标题 "sxt.rar_sxt" 暗示我们正在处理一个RAR压缩文件,其中包含一个名为"sxt"的项目。这个文件很可能是一个使用Visual C++(VC++)编写的程序,目的是实现无须额外驱动就能访问和操作摄像头的功能。在Windows环境中...

    JSP Tools

    - **hibernate_sxt_03_many2one**: 多对一关系是数据库中常见的关联类型,这个示例可能演示了如何在实体类中定义多对一关系,并进行数据操作。 - **hibernate_sxt_04_one2one1**: 一对一关系在某些场景下也很常见...

    SXT shell_SXTshell_

    【SXT Shell:一个自动化安装脚本的探索】 在IT行业中,自动化是提高效率的关键,尤其是在服务器管理和维护中。SXT Shell(SXTshell)是一个专门为实现自动化部署和配置而设计的脚本工具。它旨在简化系统管理员的...

    struts2+spring+hibernate s2sh结合方式框架搭建开发

    Hibernate是Java世界中最流行的ORM(对象关系映射)框架,它允许开发者用Java对象来表示数据库中的表,通过简单的API进行CRUD(创建、读取、更新、删除)操作。Hibernate自动处理SQL的生成和执行,降低了数据库操作...

    SXT_ksxt_

    很抱歉,但根据您给出的信息,标题"‘SXT_ksxt_’...请您提供更多的信息,例如:"SXT"具体指的是什么?描述中的内容是否与编程、网络、数据库、操作系统或其他IT领域相关?这样,我就能生成更详细、更贴切的知识点了。

    sxt66329PPT模板.pptx

    "sxt66329PPT模板.pptx" 是一款商务用途的PPT模板,适用于各类专业场合。 1. **模板选择与定制**: - 商务模板通常采用简洁、专业且色彩协调的设计,以符合商业环境的正式氛围。"sxt66329" 模板可能包含一系列预设...

    sxt+doswin1.zip

    综上所述,sxt+doswin1.zip这份压缩包内容,不仅为工程师们提供了实用的工具,更是一次对技术历史的回顾。它提醒我们,在追求技术的最新发展的同时,也需要尊重和传承那些曾经为技术进步做出贡献的经典。正如刘经理...

    sxt.rar_c#扇形图

    本资源"**sxt.rar_c#扇形图**"提供了一段代码,可以帮助开发者自定义绘制扇形统计图。 在C#中,我们可以利用GDI+(Graphics Device Interface Plus)库来实现图形绘制,包括扇形图。GDI+是.NET Framework的一部分,...

    sxt.rar_c# 摄像头实例

    综上所述,"sxt.rar_c# 摄像头实例"应该包含一个简单的C#项目,演示了如何使用C#语言以及上述技术之一或多种,实现对摄像头的基本操作和功能。通过分析和学习这个实例,开发者可以更好地理解和掌握在C#环境中如何...

    sxt\weblogic\weblogic安装.avi

    sxt\weblogic\weblogic安装.avi sxt\weblogic\weblogic安装.avisxt\weblogic\weblogic安装.avi sxt\weblogic\weblogic安装.avi

    sxt_api_14.jar

    sxt_api_14.jar,便于下载可以使用

    sxt.rar_数据结构

    本资源包“sxt.rar_数据结构”中包含了关于链表算法的程序实现,通过C++语言进行编写,旨在帮助我们深入理解和实践链表的操作。 链表不同于数组,它不是一块连续的内存空间,而是由一系列节点组成,每个节点包含...

    sxt.zip_VBa_摄像头

    标题 "sxt.zip_VBa_摄像头" 暗示了这个压缩包可能包含一个使用VBA(Visual Basic for Applications)编程实现的工具或代码,用于访问和操作摄像头。VBA是一种脚本语言,广泛应用于Microsoft Office套件中,如Excel、...

    sxt.rar_bmp_matlab采集图片

    在IT领域,尤其是在计算机视觉和图像处理中,"sxt.rar_bmp_matlab采集图片"这一主题涉及到如何使用MATLAB编程语言从摄像头捕获实时图像并将其保存为BMP格式的图片。MATLAB是一款强大的数学计算软件,同时也提供了...

    SXT.rar_DELPHI 摄像头_avicap32

    "SXT.rar_DELPHI 摄像头_avicap32"这个压缩包文件提供了一个使用Delphi编程语言进行摄像头捕捉的解决方案。Delphi是一种强大的对象 Pascal 编程环境,常用于快速开发Windows桌面应用。在这个项目中,开发者可以利用...

    sxt.rar_dll_pb9_pb9示例

    在IT行业中,动态链接库(DLL)是一种非常重要的编程元素,它允许开发人员将功能模块化,以便在多个应用程序之间共享。"sxt.rar_dll_pb9_pb9示例" 提供了一个具体的例子,展示了如何在编程中使用DLL,特别是通过PB9...

Global site tag (gtag.js) - Google Analytics