Hibernate 关联映射one-to-one

本文介绍了在Hibernate框架中实现一对一双向关联的两种方式:共享主键关联和外键关联,并提供了详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一对一关联有两种实现方式:

(1)共享的主键关联,

(2)一对一的外键关联

1、共享的主键关联:让两个对象具有共同的主键值,以表明他们之间的一一对应关系。

Person.java类

public class Person implements java.io.Serializable {
    // Fields
    private Integer id;
    private String name;
    private Idcard idcard;
}

Idcard.java类

public class Idcard implements java.io.Serializable {

    // Fields
    private Integer id;
    private String idcardno;
    private Person person;
}

Person.hbm.xml


<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.db.entity.Person" table="person" >
        <id name="id" type="java.lang.Integer">
            <column name="id" />
             <generator class="sequence" >
                 <param name="seqence">seq_sid</param>
    </generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="30" />
        </property>
        <one-to-one name="idcard" 


class="com.db.entity.Idcard" cascade="all" />
    </class>
</hibernate-mapping>

Idcard.hbm.xml

<hibernate-mapping>
    <class name="com.db.entity.Idcard" table="idcard" >
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="foreign">
            <param name="property">person</param>
            </generator>
        </id>
        <one-to-one name="person" constrained="true" class="com.db.entity.Person"></one-to-one>
        <property name="idcardno" type="java.lang.String">
            <column name="idcardno" length="20" />
        </property>
    </class>
</hibernate-mapping>

测试代码:

public static void main(String[] args) {
        // TODO Auto-generated method stub


        Session session=null;
        session=HibernateSessionFactory.getSession();
        session.beginTransaction();
        //卡
        Idcard idcard=new Idcard("2345678901");
         //人
        Person person=new Person("Lily");

        //相互包含
        person.setIdcard(idcard);
        idcard.setPerson(person);

        //添加人
        session.save(person);
     
        session.getTransaction().commit();
        
    }

2、一对一的外键关联:外键关联,本来是用于多对一的配置,但是加上唯一的限制之后(采用<many-to-one>标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性为一),也可以用来表示一对一关联关系,其实它就是多对一的特殊情况。

首先在表idcard中新添加一列pid用于共享数据

Person.java类

public class Person implements java.io.Serializable {
    // Fields
    private Integer pid;
    private String name;
    private Idcard idcard;
    .......

}

idcard.java类

public class Idcard implements java.io.Serializable {

    // Fields
    private Integer iid;
    private String idcardno;
    private Person person; ......}
Person.hbm.xml

 1 <hibernate-mapping>
 2     <class name="com.db.entity.Person" table="person">
 3         <id name="pid" type="java.lang.Integer">
 4             <column name="pid" />
 5             <generator class="sequence" />
 6         </id>
 7         <property name="name" type="java.lang.String">
 8             <column name="name" length="30" />
 9         </property>
10         <one-to-one name="idcard" class="com.db.entity.Idcard" property-ref="person"/>
11     </class>
12 </hibernate-mapping>

Idcard.hbm.xml

 1 <hibernate-mapping>
 2     <class name="com.db.entity.Idcard" table="idcard">
 3         <id name="iid" type="java.lang.Integer">
 4             <generator class="sequence">
 5             </generator>
 6         </id>
 7         <many-to-one name="person" column="pid" class="com.db.entity.Person"
 8             cascade="save-update" unique="true"/>
 9         <property name="idcardno" type="java.lang.String">
10             <column name="idcardno" length="20" />
11         </property>
12     </class>
13 </hibernate-mapping>

hibernate.cfg.xml文件和测试代码同上。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值