Topic: [hibernate]一个one-to-one的应用.doc

  Print this page

1.[hibernate]一个one-to-one的应用.doc Copy to clipboard
Posted by: jetever
Posted on: 2004-08-21 16:04

最近在做一个已经有完整的数据库的邮件系统,我在做的时候,不方便改动他原来的数据库,我想很多系统都将会是这样,不可能让数据库迁就你的web应用吧。可能这个数据库设计的比较早,中间的用户主表和用户信息表之间就有了一点问题。映射文件我是这样建立的:
<class name="net.jetmaven.model.UserInfoPO" table="personal" dynamic-update="true" dynamic-insert="true">
<id name="id" column="id" unsaved-value="null">
<generator class="identity"/>
</id>
<property name="pw_id" column="pw_id" insert="false" update="false"/>
<property name="trueName" column="trueName"/>
<property name="fax" column="fax"/>
<property name="telphone" column="telephone"/>
<property name="sex" column="sex"/>
<property name="year" column="year"/>
<property name="month" column="month"/>
<property name="day" column="day"/>
<property name="education" column="education"/>
<property name="marital" column="marital"/>
<property name="occupation" column="occupation"/>
<property name="companyname" column="companyname"/>
<property name="province" column="province"/>
<many-to-one name="systermUserPO" class="net.jetmaven.model.SystermUserPO" column="pw_id" unique="true"/>
</class>

<class name="net.jetmaven.model.SystermUserPO" table="vpopmail" dynamic-update="true" dynamic-insert="true">
<id name="pw_id" column="pw_id" unsaved-value="null">
<generator class="identity"/>
</id>
<property name="pw_name" column="pw_name"/>
<property name="pw_domain" column="pw_domain"/>
<property name="pw_passwd" column="pw_passwd"/>
<property name="pw_gecos" column="pw_gecos"/>
<property name="pw_dir" column="pw_dir"/>
<property name="pw_shell" column="pw_shell"/>
<property name="createtime" column="createtime"/>
<one-to-one name="userInfo" class="net.jetmaven.model.UserInfoPO" property-ref="pw_id" cascade="all"/>
</class>
其中SystermUserPO所对应的表中有一个数据库生成的PK是pw_id,在UserInfoPO中有个数据库生成的PK是id,还有一个pw_id的column。由于以前的数据库在建表的时候根本就没有让这两张表关联,而在我的设计中,USER是个对象,对于他们的操作,是在一个接口中的,所以我给他们建立的0ne-to-one的关系。
Ono-to-one关系分为共享主键和主键和外键关联,这个是属于第二种,因为我看了hibernate in action中的有关one-to-one的介绍,最早建立的UserInfoPO映射文件中是没有最后的many-to-one的定义得,只是在SystermUserPO中定义了
<one-to-one name="userInfo" class="net.jetmaven.model.UserInfoPO" property-ref="pw_id" cascade="all"/>
其中peoperty-ref=”pw_id”就是用来对付这种主键和一个字段关联的问题的。可是测试结果很奇怪,可以级联更新,在级联插入的时候,也会插入两张表,只是UserInfoPO的pw_id却没有插入:下面是测试代码
public void testUpdatePerson() throws Exception {
SystermUserPO user = userManager.getPerson(new Integer(2));
UserInfoPO userInfoPO = user.getUserInfo();
user.setPw_passwd("abc123");
userInfoPO.setCompanyname("jetmaven");
userInfoPO.setFax("qwer");

Integer userId = userManager.savePerson(user);
System.out.println(".....................userId:" + userId);
assertTrue(userId.intValue() > 0);
}
运行结果为:
Hibernate: select systermuse0_.pw_id as pw_id1_, systermuse0_.p………………………..
Hibernate: select userinfopo0_.id as id1_, userinfopo0_.pw_i………………………………
Hibernate: update vpopmail set pw_name=?, pw_domain=?,……………………………….
Hibernate: update personal set trueName=?, fax=?, telephone=………………………………
结果是正确的。

public void testInsertPerson() throws Exception {
SystermUserPO systermUserPO = new SystermUserPO();

systermUserPO.setPw_name("test");
systermUserPO.setPw_passwd("123");
systermUserPO.setPw_domain("test@ass.com");

UserInfoPO userInfoPO = new UserInfoPO();
userInfoPO.setSystermUserPO(systermUserPO);
userInfoPO.setCompanyname("asdfasdf");
userInfoPO.setFax("lslslkdkslksl");

systermUserPO.setUserInfo(userInfoPO);
userManager.savePerson(systermUserPO);
}
可是insert的结果就有问题了,结果是:
Hibernate: insert into vpopmail (pw_name, pw_domain, pw_passwd) values (?, ?, ?)
Hibernate: insert into personal (fax, companyname) values (?, ?)
可以看到,虽然也是插入了两张表,可是personal中只是插入了,fax和companyname,而和主表作关联的pw_id却没有得到vpopmail表中的内容并且插入。
后来我就在UserInfoPO中加上了一个many-to-one的关系:
<many-to-one name="systermUserPO" class="net.jetmaven.model.SystermUserPO" column="pw_id" unique="true"/>
这个是非常典型的用many-to-one定义one-to-one关系得方法了。这个执行testinsert的结果就正确了:
Hibernate: insert into vpopmail (pw_name, pw_domain, pw_passwd) values (?, ?, ?)
Hibernate: insert into personal (fax, companyname, pw_id) values (?, ?, ?)
可以看到在插入第2张表的时候,就有了pw_id这项了。检查数据库后,结果也是正确的。
在数据库中我没有定义这两张表之间的关系,这样就依靠hibernate中的关系定义来实现多表的操作。


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923