Hibernate 多对一外键单向关联

        Hibernate 多对一外键单向关联

        一 模式介绍

        多个人,对应一个地址,N to One

        二 实体(省略getter和setter方法)

       

  1. public class Person
  2. {
  3.     private int personid;
  4.     private String name;
  5.     private int age;
  6.     private Address address;
  7.         ......
  8. }
  1. public class Address
  2. {
  3.     private int addressid;
  4.     private String addressdetail;
  5.         ......
  6. }

           三 数据表结构

           CREATE TABLE `address1` (
  `addressid` int(11) NOT NULL,
  `addressdetail` varchar(255) default NULL,
  PRIMARY KEY  (`addressid`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

 

CREATE TABLE `person1` (
  `personid` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  `address_id` int(11) default NULL,
  PRIMARY KEY  (`personid`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

 

           四 映射方法

 <?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="example.singlentoone.Person" table="person1" lazy="false">
        <id name="personid" type="integer">
            <generator class="increment"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="age" type="integer">
            <column name="age"/>
        </property>
        <many-to-one name="address" column="address_id"/>          //这里一定要注意,写在多的那端,不能写在一的那端
    </class>
   
    <class name="example.singlentoone.Address" table="address1">
     <id name="addressid" type="integer">
            <generator class="increment"/>
        </id>
        <property name="addressdetail">
         <column name="addressdetail"/>
        </property>
    </class>


</hibernate-mapping>
         五 测试类

  1. public static void main(String[] args)
  2.  {
  3.   
  4.   Address a = new Address();
  5.   a.setAddressdetail("北京市海淀区");
  6.   
  7.   Person yeeku1 = new Person();
  8.   Person yeeku2 = new Person();
  9.   
  10.   yeeku1.setAge(22);
  11.   yeeku1.setName("测试用户一 N to 1");  
  12.   yeeku2.setAge(22);
  13.   yeeku2.setName("测试用户二 N to 1");  
  14.   
  15.   yeeku1.setAddress(a);
  16.   yeeku2.setAddress(a);
  17.   
  18.   Session session = HibernateSessionFactory.getSession();
  19.   Transaction tx = session.beginTransaction();
  20.   
  21.   session.save(yeeku1);
  22.   session.save(yeeku2);
  23.   session.save(a);
  24.   
  25.   tx.commit();
  26.   tx = null;
  27.   HibernateSessionFactory.closeSession();
  28.   
  29.  }

             六 测试结果

Hibernate: insert into person1 (name, age, address_id, personid) values (?, ?, ?, ?)
Hibernate: insert into person1 (name, age, address_id, personid) values (?, ?, ?, ?)
Hibernate: insert into address1 (addressdetail, addressid) values (?, ?)

 

如果

session.save(yeeku1);
  session.save(yeeku2);
  session.save(a);

以上三个的保存顺序没有关系,但是如果没有session.save(a);

就会报错:org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: example.singlentoone.Address

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值