Hibernate ORM One to One

  讨论下Hibernate中的一对一映射。

 

  首先来了解一下一对一的单向关联映射,以Person与IDCard为例,一个人只能拥一张身份证,而一张身份证只能属于一个人,并且从Person的角度讲,需要知道拥有的是哪张IDCard,而从IDCard来讲,则没有这方面的需求。当然需求也不是死的,这里也只是举例而已,不必较真。

  1.Person.java

 

package com.template.model;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-7-20
 * Time: 下午8:13
 * To change this template use File | Settings | File Templates.
 */
public class Person {
    private Integer id;
    private String name;

    private IDCard card;

    public Person() {
    }
}

 

  2.IDCard.java

 

package com.template.model;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-7-20
 * Time: 下午8:13
 * To change this template use File | Settings | File Templates.
 */
public class IDCard {
    private Integer id;
    private String number;

    public IDCard() {
    }
}

 

 

  3.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 default-access="field">

    <class name="com.template.model.Person" table="person">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <property name="name" column="name" type="java.lang.String"/>
        <many-to-one name="card" class="com.template.model.IDCard" column="cardid" unique="true"/>
    </class>

</hibernate-mapping>

 

 

  4.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 default-access="field">

    <class name="com.template.model.IDCard" table="idcard">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <property name="number" column="number" type="java.lang.String"/>
    </class>

</hibernate-mapping>

  这里的设置是让person表来维护这个一对一的关系,并且主键的生成方式是交给数据库来完成的,特别需要注意的一点是如果主键的生成方式是native,那么如果你是在Mysql数据库中创建表的话,记得在id字段后加上AUTO_INCREMENT,否则会报错。至于其他的数据库,因为还没有研究,所以还不知道,如果那么高手知道请留言,谢谢。

 

 依就以上例,如果想建立一个一对一的双向关联,那么Person.java和Person.hbm.xml文件不需要修改,只需要依次修改IDCard.java和IDCard.hbm.xml文件。以下是修改后的文件。

 

  5.IDCard.java

 

package com.template.model;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-7-20
 * Time: 下午8:13
 * To change this template use File | Settings | File Templates.
 */
public class IDCard {
    private Integer id;
    private String number;

    private Person person;

    public IDCard() {
    }
}

 

 

  6.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 default-access="field">

    <class name="com.template.model.IDCard" table="idcard">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <property name="number" column="number" type="java.lang.String"/>
        
        <one-to-one name="person" class="com.template.model.Person"/>
    </class>

</hibernate-mapping>

 

  在这里就不写出hbm文件对应的sql语句了,相信从映射文件里你应该能够想到sql怎么写了吧。可以看出在person表里用了cardid这个字段来维护Person和IDCard这两个对象的关系。

 

 

你可能感兴趣的:(Hibernate,one-to-one)