第一种一对一

person和card,card的id即作为主键,又作为外键 

  1. // 各村对方的一个对象
  2. public class Person {
  3.  
  4. private Integer id;
  5. private String name;
  6. private Card card;
  7. }
  8. public class Card {
  9.  
  10. private Integer id;
  11. private String cardnum;
  12. private Person person;
  13. }

xxx.hbm.xml 的配置

记得在总配置文件中添加这两个配置文件 

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.kaishengit.pojo">
  6.  
  7. <class name="Card" table="card">
  8. <id name="id">
  9. <!-- 主键生成策略变成foreign,表示又当主键又当外键 -->
  10. <generator class="foreign">
  11. <!-- 这个person是属性,指明用card这个类的person属性对应的表的主键作外键 -->
  12. <param name="property">person</param>
  13. </generator>
  14. </id>
  15. <property name="cardnum"/>
  16. <one-to-one name="person" class="Person"/>
  17. </class>
  18.  
  19. </hibernate-mapping>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.kaishengit.pojo">
  6.  
  7. <class name="Person" table="person">
  8. <id name="id">
  9. <generator class="native"/>
  10. </id>
  11. <property name="name"/>
  12. <!-- cascade="delete"表示删除人的时候把卡删了 -->
  13. <one-to-one cascade="delete" name="card" class="Card"/>
  14.  
  15. </class>
  16.  
  17. </hibernate-mapping>

程序执行

  1. Person p = new Person();
  2. p.setUsername("tom");
  3.  
  4. Card c = new Card();
  5. c.setCardnum("12");
  6. c.setPerson(p);
  7.  
  8. session.save(p);
  9. session.save(c);
  10. /* 这时候有两条sql,都是insert,改变save(p),save(c)的顺序式没用的
  11. 因为card的insert必须要有id,id不能为空,因为它作为主键,所以程序只能
  12. 先save(p)*/
  13.  
  14. Person p = new Person();
  15. p.setUsername("tom");
  16.  
  17. Card c = new Card();
  18. c.setCardnum("12");
  19.  
  20. p.setCard(c);
  21.  
  22. session.save(p);
  23. session.save(c);
  24.  
  25. /* 这样做就会报错了,因为主键的生成策略是从card找person属性
  26. 所以这种情况就只能让又当主键又当外键的那个表来维护关系 */

查询     这种情况下的查询都是联接查询,有捆绑性

  1. Card card = (Card) session.get(Card.class, 2);
  2. System.out.println(card.getCardnum());
  3. System.out.println(card.getPerson().getName());
  4.  
  5. Person p = (Person) session.get(Person.class, 2);
  6. System.out.println(p.getName());
  7. System.out.println(p.getCard().getCardnum());

删除

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.kaishengit.pojo">
  6.  
  7. <class name="Person" table="person">
  8. <id name="id">
  9. <generator class="native"/>
  10. </id>
  11. <property name="name"/>
  12. <!-- cascade="delete"表示删除人的时候把卡删了 -->
  13. <one-to-one cascade="delete" name="card" class="Card"/>
  14.  
  15. </class>
  16.  
  17. </hibernate-mapping>

----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------

第二种一对一,是一对多或者多对一的特殊情况,具有延迟加载的能力

dept和Employee,dept中有eid,Employee中有deptid 

  1. // 各村对方的一个对象
  2. public class Dept {
  3.  
  4. private Integer id;
  5. private String name;
  6. private Employee employee;
  7. }
  8. public class Employee {
  9.  
  10. private Integer id;
  11. private String name;
  12. private Dept dept;
  13. }

xxx.hmb.xml的配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.kaishengit.pojo">
  6.  
  7. <class name="Dept" table="dept">
  8. <id name="id">
  9. <generator class="native"/>
  10. </id>
  11.  
  12. <property name="name"/>
  13. <!-- 是多对一的特殊情况,需要指定unique="true"唯一性 -->
  14. <many-to-one name="employee" class="Employee" unique="true" column="eid"/>
  15.  
  16. </class>
  17.  
  18. </hibernate-mapping>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.kaishengit.pojo">
  6.  
  7. <class name="Employee" table="employee">
  8. <id name="id">
  9. <generator class="native"/>
  10. </id>
  11.  
  12. <property name="name"/>
  13. <!-- 是多对一的特殊情况,需要指定unique="true"唯一性 -->
  14. <many-to-one name="dept" class="Dept" unique="true" column="deptid"/>
  15.  
  16. </class>
  17.  
  18. </hibernate-mapping>

程序执行

  1. Employee e = new Employee();
  2. e.setName("jack");
  3.  
  4. Dept d = new Dept();
  5. d.setName("hr");
  6.  
  7. d.setEmployee(e);
  8.  
  9. e.setDept(d);
  10.  
  11. session.save(e);
  12. session.save(d);

请看这里,这是双向维护关系,而且必须双向维护关系,不可避免的会多一条update语句

hibernate 数据关联一对一 3.2的更多相关文章

  1. hibernate 数据关联一对一

    第一种一对一 person和card,card的id即作为主键,又作为外键  // 各村对方的一个对象 public class Person { private Integer id; privat ...

  2. hibernate 数据关联一对多 3.1

    一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...

  3. hibernate 数据关联一对多

    一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...

  4. hibernate 数据关联多对多 4.1

    多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...

  5. hibernate 数据关联多对多

    多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...

  6. hibernate之关于一对一单向,双向关联映射

    [hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...

  7. hibernate 关系映射之 单向外键关联一对一

    这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...

  8. Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射

                                                        Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...

  9. 初识Hibernate之关联映射(二)

    上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...

随机推荐

  1. php抽象类和接口

    接口 使用接口,你可以指定某个类必须实现那些方法,但是不需要定义这些方法的具体内容,我们可以通过interface来定义一个接口,就像定义标准类一样,但其中定义所有的方法都是空的,接口中定义的所有的方 ...

  2. 【C/C++多线程编程之九】pthread读写锁

    多线程编程之读写锁      Pthread是 POSIX threads 的简称,是POSIX的线程标准.         pthread读写锁把对共享资源的訪问者分为读者和写者,读者仅仅对共享资源 ...

  3. sql语句开发使用---update

    单表的更新大家都用过了,现在说下实际开发过程中,需要多表的查询更新状态,或者跨数据库的更新状态. 东西需要学习了才会懂得,所以站在巨人的肩膀看的更远. sql 语法; UPDATE 表名称 SET 列 ...

  4. MD5随机散列加密算法

    项目中需要在登录验证用户名.密码的时候对密码进行加密处理,由于是比较商业化的软件,所以安全方面还是必须要考虑的.而使用MD5随机散列加密算法使得密码加密后不可逆,很大程度上提升了安全性.废话不多说,看 ...

  5. 设置cell背景色半透明

    cell.backgroundColor = [UIColor colorWithRed:(247.0/255.0) green:(151.0/255.0) blue:(121.0/255.0) al ...

  6. 【LINUX】SHELL syntax error:unexpected end of file

    解决思路: DOS下文件和Linux下文件格式差异问题导致的. DOS下的文本文件是以\r\n作为断行标志的,表示成十六进制就是0D 0A.而Unix下的文本文件是以\n作为断行标志的,表示成十六进制 ...

  7. 1.1. chromium源代码分析 - chromiumframe - 介绍

    本人能力有效,面对chromium庞大的代码就头大.还是先由前辈的chromiumFrame入手. 1. chromeFrame概貌 chromiumFrame是前辈的心血之作,以最小化的方式抽出ch ...

  8. poj 3358

    /** 大意: 给定小数(p/q),求其循环节的大小和循环节开始的位置 解法: 若出现循环 ai*2^m= aj%p; 即 2^m %p =1 若2与p 互素,则可由欧拉函数的, 不互素,需将其转化为 ...

  9. kali nessus 安装插件失败解决方法

    code码获取: http://www.tenable.com/products/nessus/select-your-operating-system 首先切换到nessus安装目录下: 1.nes ...

  10. 简单的Coretext 图文混排

    在很多新闻类或有文字展示的应用中现在都会出现图文混排的界面例如网易新闻等,乍一看去相似一个网页,其实这样效果并非由UIWebView 加载网页实现.现在分享一种比较简单的实现方式 iOS sdk中为我 ...