zoukankan      html  css  js  c++  java
  • Hibernate关联映射之_一对一

    数据库模型

      一般对一对一的关系而言,会存在一个主从关系。如 人 与 身份证,就是一个一对一关系, 人 是主,身份证 是从

    Person

      PK:id

        name

        age

    Id_Card

      PK、FK:id

        useful_life

    一般在设计的时候,对于主表的id,由自增长或序列产生,从表的主键id可以直接使用主表的主键id,不需要自己重新生成


     Domain

     1 package org.zln.hibernate.domain;
     2 
     3 /**
     4  * Created by coolkid on 2015/6/20 0020.
     5  */
     6 public class Person {
     7     private int id;
     8     private String name;
     9     private IdCard idCard;
    ...43 }
     1 package org.zln.hibernate.domain;
     2 
     3 
     4 /**
     5  * Created by coolkid on 2015/6/20 0020.
     6  */
     7 public class IdCard {
     8     private int id;
     9     private String usefulLife;//证件有效期
    10     private Person person;
    ...
    43 }

    XML

     Person.hbm.xml

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     5 <hibernate-mapping package="org.zln.hibernate.domain">
     6 
     7     <class name="Person" table="person">
     8         <id name="id" column="id">
     9             <generator class="native"/>
    10         </id>
    11         <property name="name" column="name"/>
    12         <!--一对一关系映射-->
    13         <one-to-one name="idCard" />
    14     </class>
    15 
    16 </hibernate-mapping>

    IdCard.hbm.xml

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     5 <hibernate-mapping package="org.zln.hibernate.domain">
     6 
     7     <class name="IdCard" table="id_card">
     8         <id name="id" column="id">
     9             <!--主键依赖类中的属性-->
    10             <generator class="foreign">
    11                 <!--外键从person属性中引用过来  从person 的 getId 方法获取-->
    12                 <param name="property">person</param>
    13             </generator>
    14         </id>
    15         <property name="usefulList" column="useful_life"/>
    16         <!--一对一关系映射-->
    17         <one-to-one name="person" />
    18     </class>
    19 
    20 </hibernate-mapping>

     Dao

     1 package org.zln.hibernate.dao;
     2 
     3 import org.hibernate.Session;
     4 import org.hibernate.Transaction;
     5 import org.zln.hibernate.domain.IdCard;
     6 import org.zln.hibernate.domain.Person;
     7 import org.zln.hibernate.utils.HibernateUtils;
     8 
     9 /**
    10  * Created by coolkid on 2015/6/20 0020.
    11  */
    12 public class PersonDao {
    13 
    14     /**
    15      * 保存Person及其IdCard
    16      * @param person 人
    17      * @param idCard 身份证
    18      */
    19     public void savePerson(Person person,IdCard idCard){
    20         Session session = null;
    21         Transaction transaction = null;
    22         try {
    23             session = HibernateUtils.getSession();
    24             transaction = session.beginTransaction();
    25 
    26             person.setIdCard(idCard);
    27             idCard.setPerson(person);
    28 
    29             session.save(person);
    30             session.save(idCard);
    31 
    32             transaction.commit();
    33         }finally {
    34             if (session != null){
    35                 session.close();
    36             }
    37         }
    38     }
    39 
    40     /**
    41      * 通过id查询person
    42      * @param person person
    43      * @return Person
    44      */
    45     public Person getPerson(Person person){
    46         Session session = null;
    47         Person person1 = null;
    48         try {
    49             session = HibernateUtils.getSession();
    50             person1 = (Person) session.get(Person.class,person.getId());
    51         }finally {
    52             if (session != null){
    53                 session.close();
    54             }
    55         }
    56         return person1;
    57     }
    58 }

    另一种一对一关系的实现,就是使用多对一的方法,但是对“多”加唯一性约束

    在配置IdCard的name属性时,使用<many-to-one>标签,对应的column是person_id,设置unique="true",这样也实现了一对一关系映射

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     5 <hibernate-mapping package="org.zln.hibernate.domain">
     6 
     7     <class name="IdCard" table="id_card">
     8         <id name="id" column="id">
     9             <generator class="native"/>
    10         </id>
    11         <property name="usefulList" column="useful_life"/>
    12         <many-to-one name="person" column="person_id" unique="true" not-null="true"/>
    13     </class>
    14 
    15 </hibernate-mapping>
  • 相关阅读:
    【】130个好的资源网站
    c++输出控制字体颜色
    【】程序员经典面试题
    c语言链表——模拟链表
    c语言链表——链表
    一些Markdown编辑器
    【】如何评价Github发布的文本编辑器atom?
    遍历简单XML节点
    jQuery重要插件!
    nvarchar与varchar的区别
  • 原文地址:https://www.cnblogs.com/sherrykid/p/4590947.html
Copyright © 2011-2022 走看看