`
freeman983
  • 浏览: 230285 次
社区版块
存档分类
最新评论

hibernate one-to-one 表关联解决方案

阅读更多
在hibernate一对一实体映射中,常用有2种方式,一种就是把一对一看作多对一的一个特例,即通过外健参考。另一种是通过主健参考,限制2个数据表中的主健使用相同的值。

看如下一个例子:一个顾客住一个房间。如果使用不同的方式,其数据表的设计是不同的(这里hibernate的具体用法就不细述了)。如果是通过外健连接,就是一对多的特例,其表结构如图:


hibername的配置文件如下:
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hiber">

    <class name="User" table="user">
        <id name="id" column="user_id" unsaved-value="0">
            <generator class="increment"></generator>
        </id>
        <property name="name" column="name" type="string"></property>
        <many-to-one name="room" column="ROOM_ID" class="Room" cascade="all" unique="true"/>
    </class>

</hibernate-mapping>

常见问题说明:cascade="all",cascade (级联),指主控方执行操作时,关联对象是否同步执行同一操作。例如:对主控方调用sava-update或delete方法时,是否对关联对象进行同样的操作。此处设置为all,表示无论主控方执行何种操作(insert,update,delete)都对其关联对象执行同样的操作

Room.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hiber">

    <class name="Room" table="room">
        <id name="id" column="room_id" unsaved-value="0">
            <generator class="increment"></generator>
        </id>
        <property name="address" column="address" type="string"></property>
        <one-to-one name="user" class="User" property-ref="room"></one-to-one>
    </class>
</hibernate-mapping>

另外一种方式是一对一的主键关联。限制兩各数据表的主键使用相同的值,如此一个User与Room就是一对一关系。如图:


hibernate的配置文件如下

User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hiber">

    <class name="User" table="user">
        <id name="id" column="user_id" unsaved-value="0">
            <generator class="increment"></generator>
        </id>
        <property name="name" column="name" type="string"></property>
        <one-to-one name="room" class="Room" cascade="all"></one-to-one>
    </class>

</hibernate-mapping>

Room.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hiber">

    <class name="Room" table="room">
        <id name="id" column="room_id" unsaved-value="0">
            <generator class="increment"></generator>
        </id>
        <property name="address" column="address" type="string"></property>
        <one-to-one name="user" class="User" constrained="true"></one-to-one>
    </class>
</hibernate-mapping>

注:在一对一主键对应时
        <id name="id" column="room_id" unsaved-value="0">
            <generator class="increment"></generator>
        </id>
可以用
        <id name="id" column="room_id" unsaved-value="0">
            <generator class="foreign">
                <param name="property">user</param>
            </generator>
        </id>

替换。即第二种方式不需要再创见主键生成器。



注:在Room.hbm.xml这里,必須限制其主键与User的主键相同,而在属性上,使用 constrained="true"(约束条件)告诉Hibernate参考至User的主键。由于采用了主键关联,那么通过主键关联的两张表,其关联的主键值必须保持同步。也就是说,只需要为一张表设置主键生产器,而另一张表的主键与之共享同一主键值。
  • 大小: 8.1 KB
  • 大小: 7.2 KB
分享到:
评论

相关推荐

    bookManager:用于Spring Boot的Book Manager一对多关系项目

    下表关系图说明了此解决方案中设计的数据库: 一对多关系是指两个实体/表A和B之间的关系,其中A的一个元素/行可以与B的许多元素链接,但是B的成员仅与A的一个元素链接。 在此示例中,book_category和book表具有一对...

    Java面试宝典-经典

    如何书写一个 one to many 配置文件. 122 11、iBatis与Hibernate有什么不同? 122 12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? ...

    springmybatis

    mybatis实战教程mybatis in action之四实现关联数据的查询 mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action...

    Java面试宝典2010版

    如何书写一个 one to many 配置文件. 11、iBatis与Hibernate有什么不同? 12、写Hibernate的一对多和多对一双向关联的orm配置? 9、hibernate的inverse属性的作用? 13、在DAO中如何体现DAO设计模式? 14、spring+...

    最新Java面试宝典pdf版

    如何书写一个 one to many 配置文件. 122 11、iBatis与Hibernate有什么不同? 122 12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? ...

    Java面试笔试资料大全

    如何书写一个 one to many 配置文件. 122 11、iBatis与Hibernate有什么不同? 122 12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? ...

    JAVA面试宝典2010

    如何书写一个 one to many 配置文件. 122 11、iBatis与Hibernate有什么不同? 122 12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? ...

    java面试题大全(2012版)

    如何书写一个 one to many 配置文件. 122 11、iBatis与Hibernate有什么不同? 122 12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? ...

    Java面试宝典2012版

    如何书写一个 one to many 配置文件. 122 11、iBatis与Hibernate有什么不同? 122 12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计...

    java面试宝典2012

    如何书写一个 one to many 配置文件. 133 11、iBatis与Hibernate有什么不同? 133 12、写Hibernate的一对多和多对一双向关联的orm配置? 134 9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? ...

    Java面试宝典2012新版

    如何书写一个 one to many 配置文件. 122 11、iBatis与Hibernate有什么不同? 122 12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? ...

    Java 面试宝典

    一. Java 基础部分..................................................................................................................... 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?...

Global site tag (gtag.js) - Google Analytics