Hibernate关联之一对一主键双向关联

来源:互联网 发布:淘宝卖家店铺名称 编辑:程序博客网 时间:2024/05/29 07:54
Hibernate一对一主键双向关联
 
一对一主键映射在一对一映射中还算是最为常用的。
   
一、模型介绍
 
一个人(Person)对应一个地址(Address)。
 
二、实体(省略getter、setter方法)
 
public class Person11pkboth {

   private int personid;

    private String name;

    private int age;

    private Address11pkboth address11pkboth;

 
 

public class Address11pkboth {

   private int addressid;

    private String addressdetail;

    private Person11pkboth person11pkboth;

 
 
 
 
三、表模型
 
mysql> desc address_11pkboth;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| addressid     | int(11)      | NO   | PRI | NULL    | auto_increment |
| addressdetail | varchar(255) | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
 
mysql> desc person_11pkboth;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| personid | int(11)      | NO   | PRI |         |       |
| name     | varchar(255) | YES  |     | NULL    |       |
| age      | int(11)      | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
 
四、生成的SQL脚本
 
/* Formatted on 2007/08/22 14:40 (QP5 v5.50) */
CREATE TABLE `address_11pkboth` (
  `addressid` int(11) NOT NULL auto_increment,
  `addressdetail` varchar(255) default NULL,
  PRIMARY KEY  (`addressid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;
 
 
/* Formatted on 2007/08/22 14:41 (QP5 v5.50) */
CREATE TABLE `person_11pkboth` (
  `presonid` int(11) NOT NULL,
  `name` varchar(255) default NULL,
  `age` int(11) default NULL,
  PRIMARY KEY  (`presonid`),
  KEY `FK68A882C591BB393E` (`presonid`),
  CONSTRAINT `FK68A882C591BB393E` FOREIGN KEY (`presonid`) REFERENCES `address_11pk` (`addressid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
 
 
五、映射方法:
 
OneToOnePKBothPerson.hbm.xml
<span style="color:#000000;"><hibernate-mapping>   <class name="com.bean.Person11pkboth" table="PERSON_11pkboth">      <id name="personid" type="java.lang.Integer">          <column name="id" />            <generator class="identity" />         </id>       <property name="name" type="java.lang.String">           <column name="name" length="24" not-null="true">              <comment>姓名</comment>              </column>          </property>        <property name="age" />        <!-- cascade="all":在保存person11pkboth对象的时候,级联保存person11pkboth对象关联的address11pkboth对象    -->      <one-to-one name="address11pkboth" cascade="all" />      </class>  </hibernate-mapping></span>

OneToOnePKBothAddress.hbm.xml
<span style="color:#000000;"><hibernate-mapping>  <class name="com.bean.Address11pkboth" table="ADDRESS_11pkboth" catalog="HibernateMapping">      <id name="addressid" type="java.lang.Integer">          <column name="id" />            <!-- class="foreign": 一对一主键映射中,使用另外一个相关联的对象的标识符 -->      <generator class="foreign">              <param name="property">person11pkboth</param>              </generator>    </id>    <property name="addressdetail" type="java.lang.String">          <column name="addressdetail" length="120" not-null="true">              <comment>详细地址</comment>              </column>    </property>        <!-- 表示在address表存在一个外键约束,外键参考相关联的表person -->    <one-to-one name="person11pkboth" constrained="true" />      </class>  </hibernate-mapping></span>

六、测试
 
<span style="color:#000000;">public class Test_11pkboth {@Testpublic void test_11pkboth(){Person11pkboth person11pkboth = new Person11pkboth();person11pkboth.setName("刘大");person11pkboth.setAge(26);    Address11pkboth address11pkboth = new Address11pkboth();     address11pkboth.setAddressdetail("XX街X号");        person11pkboth.setAddress11pkboth(address11pkboth);    address11pkboth.setPerson11pkboth(person11pkboth);    Session session = HibernateUtil.getCurrentSession();     Transaction tx = session.beginTransaction();     session.save(person11pkboth);    session.save(address11pkboth);    tx.commit();    HibernateUtil.closeSession();}}</span>

 
0 0