讨论下Hibernate中的一对一映射。
首先来了解一下一对一的单向关联映射,以Person与IDCard为例,一个人只能拥一张身份证,而一张身份证只能属于一个人,并且从Person的角度讲,需要知道拥有的是哪张IDCard,而从IDCard来讲,则没有这方面的需求。当然需求也不是死的,这里也只是举例而已,不必较真。
1.Person.java
package com.template.model; /** * Created by IntelliJ IDEA. * User: Zhong Gang * Date: 11-7-20 * Time: 下午8:13 * To change this template use File | Settings | File Templates. */ public class Person { private Integer id; private String name; private IDCard card; public Person() { } }
2.IDCard.java
package com.template.model; /** * Created by IntelliJ IDEA. * User: Zhong Gang * Date: 11-7-20 * Time: 下午8:13 * To change this template use File | Settings | File Templates. */ public class IDCard { private Integer id; private String number; public IDCard() { } }
3.Person.hbm.xml
<?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 default-access="field"> <class name="com.template.model.Person" table="person"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="name" column="name" type="java.lang.String"/> <many-to-one name="card" class="com.template.model.IDCard" column="cardid" unique="true"/> </class> </hibernate-mapping>
4.IDCard.hbm.xml
<?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 default-access="field"> <class name="com.template.model.IDCard" table="idcard"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="number" column="number" type="java.lang.String"/> </class> </hibernate-mapping>
这里的设置是让person表来维护这个一对一的关系,并且主键的生成方式是交给数据库来完成的,特别需要注意的一点是如果主键的生成方式是native,那么如果你是在Mysql数据库中创建表的话,记得在id字段后加上AUTO_INCREMENT,否则会报错。至于其他的数据库,因为还没有研究,所以还不知道,如果那么高手知道请留言,谢谢。
依就以上例,如果想建立一个一对一的双向关联,那么Person.java和Person.hbm.xml文件不需要修改,只需要依次修改IDCard.java和IDCard.hbm.xml文件。以下是修改后的文件。
5.IDCard.java
package com.template.model; /** * Created by IntelliJ IDEA. * User: Zhong Gang * Date: 11-7-20 * Time: 下午8:13 * To change this template use File | Settings | File Templates. */ public class IDCard { private Integer id; private String number; private Person person; public IDCard() { } }
6.IDCard.hbm.xml
<?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 default-access="field"> <class name="com.template.model.IDCard" table="idcard"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="number" column="number" type="java.lang.String"/> <one-to-one name="person" class="com.template.model.Person"/> </class> </hibernate-mapping>
在这里就不写出hbm文件对应的sql语句了,相信从映射文件里你应该能够想到sql怎么写了吧。可以看出在person表里用了cardid这个字段来维护Person和IDCard这两个对象的关系。