Hibernate 多对多单向关联

         Hibernate 多对多单向关联

         一 模型介绍

         多个人,对应多个地址,一个人可以对应多个地址,一个地址也可以对应多个人

          在使用这种映射方式时必须要使用连接表。

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

         public class Address
{
 private int addressid;
 private String addressdetail;
......

}

         public class Person implements Serializable
{

 private static final long serialVersionUID = 1L;
 private int personid;
 private String name;
 private int age;
 private Set addresses = new HashSet();

......

}

       三 表结构

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

 

CREATE TABLE `join_table2` (
  `person_id` int(11) NOT NULL,
  `address_id` int(11) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

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

 

        四 映射方法

<hibernate-mapping>
    <class name="example.singlenton.Address" table="address3">
     <id name="addressid" type="integer">
            <generator class="increment"/>
        </id>
        <property name="addressdetail">
         <column name="addressdetail"/>
        </property>
    </class>
   
    <class name="example.singlenton.Person" table="person3">
        <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>
        <set name="addresses" table="join_table2"> //因为是单向的映射,所以,set写在调用另一个实体的一边
            <key column="person_id"/>
          <many-to-many column="address_id" class="example.singlenton.Address"/>
        </set>
                
    </class>

          五 测试类

public static void main(String[] args)
 {
  
  Person yeeku1 = new Person();
  Person yeeku2 = new Person();

  yeeku1.setAge(111);
  yeeku1.setName("测试1111 N to N");
  yeeku2.setAge(222);
  yeeku2.setName("测试2222 N to N");

  Address a1 = new Address();
  a1.setAddressdetail("长安街道66号");

  Address a2 = new Address();
  a2.setAddressdetail("测试地址");
  
  Address a3 = new Address();
  a3.setAddressdetail("望京西街");


  yeeku1.getAddresses().add(a1);
  yeeku1.getAddresses().add(a2);
  
  yeeku2.getAddresses().add(a2);
  yeeku2.getAddresses().add(a3);

  Session session = HibernateSessionFactory.getSession();
  Transaction tx = session.beginTransaction();
  
  session.save(yeeku1);
  session.save(yeeku2);

  session.save(a1);
  session.save(a2);
  session.save(a3);

  tx.commit();
  tx = null;
  HibernateSessionFactory.closeSession();

 }

        六 运行结果

Hibernate: insert into person3 (name, age, personid) values (?, ?, ?)
Hibernate: insert into person3 (name, age, personid) values (?, ?, ?)
Hibernate: insert into address3 (addressdetail, addressid) values (?, ?)
Hibernate: insert into address3 (addressdetail, addressid) values (?, ?)
Hibernate: insert into address3 (addressdetail, addressid) values (?, ?)
Hibernate: insert into join_table2 (person_id, address_id) values (?, ?)
Hibernate: insert into join_table2 (person_id, address_id) values (?, ?)
Hibernate: insert into join_table2 (person_id, address_id) values (?, ?)
Hibernate: insert into join_table2 (person_id, address_id) values (?, ?)

 

注:

推荐使用

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

  session.save(a1);
  session.save(a2);
  session.save(a3);

这样保存。

因为是多对多的操作,所以大家在操作的时候一定要注意对应关系,否则的话,乱得不堪设想……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值