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 |