一对一唯一外键关联映射(单向)

简介:
       一对唯一外键关联映射是采用多对一关联映射方法来解决一对一的问题,它就是多对一的一个特例。
       它是基于这样一种思想:在映射多的一端时采用<many-to-one>标签,并且用属性unique=true来限定它是唯一的,这样就实现了多的一端的多重性为一。但是,它仍保留多対一的痕迹(比如关系模型中增加一个外键字段)。
 
1.实体模型:
 
  此处单向是由person加载idcard,所以Person中要保存IdCard的对象。
 
2.关系模型:
 
3.实体类:
  IdCard.java
public  class IdCard { 
   private Integer id; 
   private String cardNo; 
     //一系列的getter.setter方法 
  @Override 
   public String toString() { 
     // TODO Auto-generated method stub 
     return  "Idcard:" + cardNo; 
  } 
}
    Person.java
public  class Person { 
   private Integer id; 
   private String name; 
   private IdCard idCard; 
   //一系列的setter.getter方法 
    
  @Override 
   public String toString() { 
     // TODO Auto-generated method stub 
     return  "Person:" + name; 
  } 
}
 
4.映射文件:
  IdCard.hbm.xml
   < class  name ="com.sxt.hibernate.one2one.entity.IdCard"  table ="sxt_hibernate_idCard" > 
     < id  name ="id"  length ="4" > 
       < generator  class ="native" > </ generator > 
     </ id > 
     < property  name ="cardNo"  length ="10" > </ property > 
   </ class >
   Person.hbm.xml
   < class  name ="com.sxt.hibernate.one2one.entity.Person"  table ="sxt_hibernate_person" > 
     < id  name ="id"  length ="4" > 
       < generator  class ="native" > </ generator > 
     </ id > 
     < property  name ="name"  length ="10" > </ property > 
    <!-- many-to-one标签的含义,是在本表中增加外键指向另一端。    
      unique="true"含义,是本表的本字段加上唯一性约束. 
     
--> 
     < many-to-one  name ="idcard_id"  unique ="true" > </ many-to-one > 
   </ class >
 
5.hibernate配置文件:
   参照上一篇。
 
6.测试方法:
   public  static  void main(String[] args) { 
    Session session = HibernateUtils.getSession(); 
    Transaction t = session.beginTransaction(); 

     try { 
       /** 
        * 测试插入操作 
        */
 
/*      IdCard idCard=new IdCard(); 
      idCard.setCardNo("1234567890"); 
        
      Person person=new Person(); 
      person.setIdCard(idCard); 
      //不能成功保存,会报错org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.sxt.hibernate.one2one.entity.IdCard 
      //因为idCard是transient状态 
      //要在<many-to-one>中加上cascade="save-update",或者是在session.save(person)之前session.save(idCard) 
      session.save(person);*/
 
        
/*      IdCard idCard=new IdCard(); 
      idCard.setCardNo("1234567890"); 
      session.save(idCard); 
        
      Person person=new Person(); 
      person.setName("张三"); 
      person.setIdCard(idCard); 

      session.save(person);*/
 
       /** 
        * 小结:一对一唯一外键关联是多対一关联的特例,它不会默认有cascade属性,因此save对象时要保证它的关联属性是持久化状态的或者手动设置cascade属性. 
        */
 

        
       /** 
        * 测试加载操作 
        */
 
      Person p=(Person)session.load(Person. class, 2); 
      System.out.println(p); 
      System.out.println(p.getIdCard()); 
      t.commit(); 
    }  catch (HibernateException e) { 
      e.printStackTrace(); 
      t.rollback(); 
    }  finally { 
      HibernateUtils.closeSession(session); 
    } 
  } 
}


     本文转自NightWolves 51CTO博客,原文链接: http://blog.51cto.com/yangfei520/274199 ,如需转载请自行联系原作者



相关文章
|
机器学习/深度学习 人工智能 前端开发
机器学习PAI常见问题之web ui 项目启动后页面打不开如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。
|
jenkins 持续交付 开发工具
Jenkins-pipline流水线语法介绍并结合Blue Ocean查看流水线(十四)
jenkins集成pipeline流水线 1.pipeline概述 pipeline流水线,可以直观的展示每个阶段做的任务,以及每个阶段耗费的时间。 pipeline不在使用鼠标来实现自动构建,也不要去看控制台日志,而是全程使用代码的方式来实现,构建完成后会展示一个视图,用来展示每个阶段完成的情况
555 0
Jenkins-pipline流水线语法介绍并结合Blue Ocean查看流水线(十四)
|
11月前
|
PyTorch 算法框架/工具 计算机视觉
目标检测实战(二):YoloV4-Tiny训练、测试、评估完整步骤
本文介绍了使用YOLOv4-Tiny进行目标检测的完整流程,包括模型介绍、代码下载、数据集处理、网络训练、预测和评估。
656 2
目标检测实战(二):YoloV4-Tiny训练、测试、评估完整步骤
|
弹性计算 Windows
震惊!ECS Windows 系统磁盘竟“撒谎”,空间去哪儿了?别急,这里有终极破解法!
【8月更文挑战第15天】在使用ECS Windows系统时,可能会遇到磁盘显示占用的空间远超实际文件大小的情况,导致空间不足。原因包括系统还原点、卷影副本累积及回收站文件未彻底删除等。解决方法有:清除系统还原点(`vssadmin delete shadows /all`),清空回收站,删除临时文件夹中的文件,以及检查并修复磁盘错误。这些步骤能有效释放空间,保证系统稳定运行。
262 4
|
Unix Shell 测试技术
误删数据恢复系列1
误删数据恢复系列1
226 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue的失物招领系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的失物招领系统的详细设计和实现(源码+lw+部署文档+讲解等)
169 16
|
安全 网络虚拟化 数据安全/隐私保护
(思科模拟器)单臂路由
执行流量转发的单臂路由器通常是在虚拟局域网(VLAN)上实现的。它们将使用单个以太网网络端口,作为两个或多个虚拟局域网的一部分,使它们能够加入。一个VLAN允许多个虚拟局域网共存于同一物理局域网中。
423 0
|
API 流计算
Flink on zeppelin从checkpoint&savepoint自动恢复任务​
在上一篇的文章中介绍了Flink on zeppelin怎么配置checkpoint,并且从指定的checkpoint恢复任务,但是这个过程还是相对复杂,对用户来说不是很友好,在最新的版本中,zeppelin支持了自动从checkpoint&savepoint恢复任务,只需要添加几个参数即可,下面就来介绍一下如何使用.
SpringBoot配置文件的优先级
SpringBoot配置文件的优先级
|
Java Linux 调度
Jmeter系列(7)- 基础线程组Thread Group
Jmeter系列(7)- 基础线程组Thread Group
567 0
Jmeter系列(7)- 基础线程组Thread Group