Hibernate 多对一连接表单向关联

         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;

 

CREATE TABLE `join_table1` (
  `person_id` int(11) NOT NULL,
  `address_id` int(11) default NULL
) 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.Address" table="address2">
     <id name="addressid" type="integer">
            <generator class="increment"/>
        </id>
        <property name="addressdetail">
         <column name="addressdetail"/>
        </property>
    </class>
 
  <class name="example.singlentoone.Person" table="person2" 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>
        <join table="join_table1">  //这个地方就是连接表的信息,而且一定要写到一的一边,不能写到n的一边哦
         <key column="person_id"></key>
         <many-to-one name="address" column="address_id"/>         
  </join>  
    </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 person2 (name, age, personid) values (?, ?, ?)
Hibernate: insert into join_table1 (address_id, person_id) values (?, ?)
Hibernate: insert into person2 (name, age, personid) values (?, ?, ?)
Hibernate: insert into join_table1 (address_id, person_id) values (?, ?)
Hibernate: insert into address2 (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、付费专栏及课程。

余额充值