powerwind 发表于 2006-9-5 18:44

hibernate 一对一

hibernate 一对一实践 author: hjack(好好的一篇文章,可惜现在只剩下一半)

以前看过,记得是以 many-to-one 实现一对一的。于是我自己去实现看看,结果是可行的。但是我觉得,如果只是单向的一对一,直接用 one-to-one就可以了。

我没有做实际项目,假想的例子为我们中国的一夫一妻制。两个类分别为:Husband 和 Wife,这个算是典型的一对一关系吧?!(呵呵~)

数据厍DDL为:

create table `sampledb`.`husband`(
      `id` bigint not null auto_increment,
       `marry_id` bigint,
       `name` varchar(50),
      primary key (`id`)
    );
create table `sampledb`.`wife`(
      `id` bigint not null auto_increment,
       `marry_id` bigint,
       `name` varchar(50),
      primary key (`id`)
    );

我的 mysql 数据厍里早有名为sampledb的数据厍,如果没有,要先用 create database sampledb 创建。数据表 husband 和 wife 的内容为编号、配偶编号和姓名。
两个类文件分别为:

package powerwind;

public class Wife implements java.io.Serializable {

        // Fields

        private Long id;

        private Husband husband;

        private String name;

        // Constructors

        /** default constructor */
        public Wife() {
        }

        /** full constructor */
        public Wife(Husband husband, String name) {
                this.husband = husband;
                this.name = name;
        }

        // Property accessors

        public Long getId() {
                return this.id;
        }

        public void setId(Long id) {
                this.id = id;
        }

        public Husband getHusband() {
                return this.husband;
        }

        public void setHusband(Husband husband) {
                this.husband = husband;
        }

        public String getName() {
                return this.name;
        }

        public void setName(String name) {
                this.name = name;
        }

}



package powerwind;

public class Husband implements java.io.Serializable {

        // Fields

        private Long id;

        private Wife wife;

        private String name;

        // Constructors

        /** default constructor */
        public Husband() {
        }

        /** full constructor */
        public Husband(Wife wife, String name) {
                this.wife = wife;
                this.name = name;
        }

        // Property accessors

        public Long getId() {
                return this.id;
        }

        public void setId(Long id) {
                this.id = id;
        }

        public Wife getWife() {
                return this.wife;
        }

        public void setWife(Wife wife) {
                this.wife = wife;
        }

        public String getName() {
                return this.name;
        }

        public void setName(String name) {
                this.name = name;
        }
}

两个类的配制文件几乎一样,下面只给出一个:

<?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>
        <class name="powerwind.Husband" table="husband"
                catalog="sampledb">
                <id name="id" type="java.lang.Long">
                        <column name="id" />
                        <generator class="native"></generator>
                </id>
                <many-to-one name="wife" class="powerwind.Wife"
                        fetch="select">
                        <column name="marry_id" />
                </many-to-one>               
               <property name="name" type="java.lang.String">
                        <column name="name" length="50" />
                </property>
        </class>
</hibernate-mapping>

这样竟然就行了,至于 hibernate.cfg.xml,和其它的一样,没有什么特别。再自行写个类测试下就可以了。我测试了几次,还没有发现错误,应该是可行的。

[ 本帖最后由 powerwind 于 2006-9-5 18:47 编辑 ]

hjack 发表于 2006-9-5 21:57

我那张贴从旧后院找回来了.

powerwind 发表于 2006-9-5 22:36

果然厉害,回来了耶!
觉得我没有在 many-to-one 添加 unique="true",设计欠妥,要在程序中控制唯一性。
还有,one-to-one 好像只适合共享主键的情况。

powerwind 发表于 2006-9-6 13:40

发现网上有文章介绍一对一关系的,没有用两个many-to-one的,而是其中一个用one-to-one
如: http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=1819
页: [1]
查看完整版本: hibernate 一对一