0

我是hibernate世界的新手,请您指教,我在Hibernate中经历了一对一的关系,根据我的分析,可以通过三种方式建立一对一的hibernate关系。

1)Through Join concept
2)Same primary key in both the tables
3)Primary key and foriegn key relationship in both the tables

请指教,以上三种实现一对一映射的方法是正确的,或者我遗漏了什么,请指教,也请指教我使用的以下hbm映射文件是正确的。如果不是,请指教

1)通过加入概念:-
实现一对一关系的一种方法是通过加入概念,以下xml被用于

<hibernate-mapping>

<class name="mypack.Person" table="person21">
<id name="personId" type="int">
<generator class="increment">
</generator>
</id>
<property name="name"/>

<join table="personAddress">
<key column="personId"/>
<many-to-one name="address" class="mypack.Address" column="addressId" unique="true" cascade="all"/>
</join>
</class>

<class name="mypack.Address" table="address21">
<id name="id" column="addressId" type="int">
<generator class="increment"/>
</id>
<property name="city"/>
<property name="state"/>
</class>
</hibernate-mapping>

2)两个表中的主键相同:-

在两个表中使用相同的主键,以下 hbm 被用于

 <class name="mypack.Address" table="address31">
<id name="id" column="addressId" type="int">
<generator class="increment"/>
</id>
<property name="city"/>
<property name="state"/>
</class>

<class name="mypack.Person" table="person31">
<id name="personId" type="int">
<generator class="foreign">
<param name="property">address</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="address" class="mypack.Address"/>
</class>
</hibernate-mapping>   

3)两个表中的主键和外键关系:-

一个表中的主键和另一个表中的外键。下面是这个的hbm

<hibernate-mapping>
<class name="mypack.Person">
<id name="personId" type="int">
<generator class="increment"/>
</id>
<property name="name"/>

<many-to-one name="address" class="mypack.Address" column="addressId" unique="true" cascade="all"/>
</class>


<class name="mypack.Address">
<id name="id" column="addressId" type="int">
<generator class="increment"/>
</id>
<property name="city"/>
<property name="state"/>
</class>
</hibernate-mapping>

请大家指教。

4

1 回答 1

0

我真的认为连接表对于一对一映射来说太过分了。对于其他 2 个解决方案,请查看以下 Hibernate 文档,所有内容均已解释:http ://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html#mapping-declaration-一对一

对于您的第二个映射(主键关联),两个实体都需要定义一对一映射,并且关系的一侧也需要指定属性constrained="true"

这就是我编写第二个映射的方式:

<class name="mypack.Person" table="PERSONS">
    <id name="id" type="int" column="PERSON_ID">
        <generator class="increment"/>
    </id>
    <property name="name" type="string" column="NAME"/>
    <one-to-one name="address" class="mypack.Address" cascade="all"/>
</class>

<class name="mypack.Address" table="ADDRESSES">
    <id name="id" type="int" column="ADDRESS_ID">
        <generator class="foreign">
            <param name="property">address</param>
        </generator>
    </id>
    <property name="city" type="string" column="CITY"/>
    <property name="state" type="string" column="STATE"/>
    <one-to-one name="person" class="mypack.Person" constrained="true"/>
</class>
于 2013-03-01T09:57:36.920 回答