`
KuangYeYaZi
  • 浏览: 52707 次
文章分类
社区版块
存档分类
最新评论

一对一主键关联映射(双向)

 
阅读更多
双向和单向的区别,其实不在数据库,而在加载方向。按照我们Person和IdCard的例子,单向是Person通过拥有IdCard的实例可以加载IdCard,而双向不但Person可以加载IdCard,还使IdCard通过拥有Person实例来加载Person。数据库还是原来的数据库(两个共享主键的表),不同的是在IdCard实体类中增加Person类型的变量和在IdCard.hbm.xml中增加了对该变量的配置。
 
1.实体模型:


 
 
2.关系模型:


 
 
3.实体类:
IdCard.java
public class IdCard { 
  private Integer id; 
  private String cardNo; 
  private Person person; 
//一系列的setter.getter方法 
  @Override 
  public String toString() { 
    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> 
    <!-- one-to-one标签是为了加载 --> 
    <one-to-one name="person"></one-to-one> 
  </class>
Person.hbm.xml
  <class name="com.sxt.hibernate.one2one.entity.Person" table="sxt_hibernate_person"> 
    <id name="id" length="4"> 
      <!-- person的主键来源于idCard,也就是共享idCard的主键 --> 
      <generator class="foreign"> 
        <param name="property">idCard</param> 
      </generator> 
    </id> 
    <property name="name" length="10"></property> 
    <!--one-to-one标签的含义,指示Hibernate如何加载它的关联对象,默认根据主键加载。 
      constrained="true"的含义,表明当前主键上存在一个约束,person的主键作为外键参照了idCard, 
      并且要求关联属性不能为空 
        
--> 
    <one-to-one name="idCard" constrained="true"></one-to-one> 
  </class>
 
5.hibernate配置文件
hibernate.cfg.xml
限于篇幅,可以参照上一篇的该文件,此处就不再赘述。
 
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.setName("张三"); 
      idCard.setPerson(person); 
      session.save(idCard);//这样的话,如果不在IdCard.hbm.xml的<one-to-one>中设置cascade="save-update"的话,会只保存上idCard,而保存不上关联属性person记录 
     //如果设置上cascade="save-update",则会先保存person记录,而由于person主键要引用idCard的id,此时idCard又没有保存呢,所以会报错org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: idCard 
      */
 
        
/*      IdCard idCard = new IdCard(); 
      idCard.setCardNo("1234567890"); 
      Person person = new Person(); 
      person.setName("张三"); 
      idCard.setPerson(person); 
      session.save(person);//这样貌似关系已经建立好了,但是在存person时,它的主键关联属性idCard的id,而此时idCard为null,所以还是会报错org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: idCard 
*/
 
        
/*      IdCard idCard = new IdCard(); 
      idCard.setCardNo("1234567890"); 
      Person person = new Person(); 
      person.setName("张三"); 
      person.setIdCard(idCard); 
      session.save(person);//这样,既建立好了关系,而且保存时还由person来维护关联关系,保存才是成功的 
      */

      /** 
        * 小结:插入时先插主表,后插副表.必须保证主表记录已经插入了,才能为副表提供引用需要的id. 
        */
 

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

  } 

} 

本文出自 “夜狼” 博客,请务必保留此出处http://yangfei520.blog.51cto.com/1041581/273249

 

  • 大小: 9.6 KB
  • 大小: 6.2 KB
分享到:
评论

相关推荐

    Hibernate一对一主键关联映射(双向关联)

    博文链接:https://shaqiang32.iteye.com/blog/201309

    hibernate一对一主键关联映射(双项关联)

    博文链接:https://llying.iteye.com/blog/220803

    hibernate 双向一对一基于主键的关联映射

    NULL 博文链接:https://lijunabc.iteye.com/blog/438426

    Hibernate关联映射

    Hibernate 一对一外键单向关联 Hibernate 一对一主键单向...Hibernate 一对一主键双向关联 Hibernate 一对一连接表双向关联 Hibernate 一对多外键双向关联 Hibernate 一对多连接表双向关联 Hibernate 多对多双向关联

    Hibernate教程07_关系映射之一对一双向主键关联

    http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码

    Hibernate关联关系映射目录

    Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向...├─ 一对一主键双向关联 ├─ 一对一连接表双向关联 ├─ 一对多外键双向关联 ├─ 一对多连接表双向关联 └─ 多对多双向关联

    Hibernate学习笔记

    010 一对一 主键关联映射_双向 011 一对一 唯一外键关联映射_单向 012 一对一 唯一外键关联映射_双向 013 session_flush 014 一对多关联映射 单向 015 一对多关联映射 双向 016 多对多关联映射 单向 017 多对多关联...

    hibernate学习笔记

    hibernate一对一主键关联映射(双向关联Person&lt;----&gt;IdCard) 9 hibernate一对一唯一外键关联映射(单向关联Person----&gt;IdCard) 10 hibernate一对一唯一外键关联映射(双向关联Person&lt;----&gt;IdCard) 11 session ...

    Hibernate_Annotation关联映射

    1.共享主键的一对一关联映射: @Entity @Table(name="Test_Body") public class Body { private Integer id; private Heart heart; @Id public Integer getId() { return id; } public void setId(Integer id...

    Hibernate学习笔记_songjignhao_1

    自己记录的学习笔记,内容很详细,有代码,包括:一对多双向关联关系、一对多双向自身关联关系、一对一关联关系(主键关联、外键关联)、一对多与一对一结合、多对多关联关系、Map、Set、List与Bag映射关系、查询...

    Hibernate_实体关联关系映射--学习总结

    Hibernate 实体关联关系映射 学习总结 把一对一 一对多 单向 双向 主键 外键 链接表等讲的比较清楚

    尚硅谷JPA视频教程

    JPA视频_映射双向一对一的关联关系 · 16. JPA视频_映射双向多对多的关联关系 · 17. JPA视频_二级缓存 · 18. JPA视频_JPQL_HelloWorld · 19. JPA视频_JPQL_查询缓存 · 20. JPA视频_JPQL_ORDER BY 和 GROUP...

    Hibernate3的帮助文档

    2.3. 第二部分 - 关联映射 2.3.1. 映射Person类 2.3.2. 一个单向的Set-based关联 2.3.3. 使关联工作 2.3.4. 值类型的集合 2.3.5. 双向关联 2.3.6. 使双向关联工作 2.4. 总结 3. 体系结构(Architecture) ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类集合  15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类集合  15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类集合  15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类集合  15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索...

    Hibernate注释大全收藏

    Hibernate注释大全收藏 声明实体Bean @Entity public class Flight implements Serializable { Long id; @Id public Long getId() { return id; } public void setId(Long id) { this.id...一对一 使用 @OneToOne...

Global site tag (gtag.js) - Google Analytics