在Hibernate中配置多對多連接表

 

接前文在Hibernate中配置一對多連接表

其中表roomusers更改如下:
create table ROOMUSERS(
       USERID 
NUMBER(4),
       ROOMID 
NUMBER(4not null
);

映射文件配置如下:
Room.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping package="com.cosmow.hibernatedemo2.entity">
    
<class name="Room" table="ROOM" schema="STORE">
        
<id name="id" type="java.lang.Long">
            
<column name="ID" precision="4" scale="0" />
            
<!-- Oracle數據庫增長方式序列 -->
            
<generator class="sequence">
                
<param name="sequence">ROOM_SEQ</param>
            
</generator>
        
</id>
        
<!-- 映射roomnumber屬性 -->
        
<property name="roomnumber" type="java.lang.String">
            
<column name="ROOMNUMBER" length="11" not-null="true" />
        
</property>
        
<!-- 映射name屬性 -->
        
<property name="name" type="java.lang.String">
            
<column name="NAME" length="32" not-null="true" />
        
</property>
        
<!-- 通過連接表的多端,因此需要table屬性爲roomusers -->
        
<set name="users" cascade="all" table="roomusers">
            
<!-- 該key的字段爲連接表中的字段,作爲外鍵 -->
            
<key column="roomid" />
            
<!-- 配置多對多 -->
            
<many-to-many class="Userinfo" column="userid" />
        
</set>
    
</class>
</hibernate-mapping>

Userinfo.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping package="com.cosmow.hibernatedemo2.entity">
    
<class name="Userinfo" table="USERINFO" schema="STORE">
        
<id name="id" type="java.lang.Long">
            
<column name="ID" precision="4" scale="0" />
            
<!-- Oracle數據庫增長方式序列 -->
            
<generator class="sequence">
                
<param name="sequence">USERINFO_SEQ</param>
            
</generator>
        
</id>
        
<property name="name" type="java.lang.String">
            
<column name="NAME" length="32" not-null="true" />
        
</property>
        
<property name="sex" type="java.lang.String">
            
<column name="SEX" length="2" />
        
</property>
        
<set name="rooms" cascade="all" table="roomusers">
            
<key column="userid" />
            
<many-to-many class="Room" column="roomid" />
        
</set>
    
</class>
</hibernate-mapping>

測試代碼如下:
/** *//**
 * Demo.java
 *
 * Copyright 2008. All Rights Reserved.
 
*/

package com.cosmow.hibernatedemo2.demo;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.cosmow.HibernateSessionFactory;
import com.cosmow.hibernatedemo2.entity.Room;
import com.cosmow.hibernatedemo2.entity.Userinfo;

/** *//**
 * TODO
 * 
 * Revision History
 *
 * 2008-7-11,Cosmo,created it
 
*/

public class Demo {
    
    
public void test() 
        
//第一個room實體
        Room room = new Room();
        room.setName(
"cosmoHome");
        room.setRoomnumber(
"001");
        
        
//第二個room實體
        Room room2 = new Room();
        room2.setName(
"Home2");
        room2.setRoomnumber(
"002");

        
//第一個user實體
        Userinfo user = new Userinfo();
        user.setName(
"cosmo");
        user.setSex(
"M");
        
        
//第二個user實體
        Userinfo user2 = new Userinfo();
        user2.setName(
"winnie");
        user2.setSex(
"F");

        
//創建第二個user實體與第二個room實體的關係,通過連接表維護關係
        Set<Room> roomSet = new HashSet<Room>();
        roomSet.add(room2);
        user2.setRooms(roomSet);
        
        
//創建第一個room實體與第一、第二個user實體的關係,通過連接表維護關係
        
//添加user實體到集合userSet
        Set<Userinfo> userSet = new HashSet<Userinfo>();
        userSet.add(user);
        userSet.add(user2);
        room.setUsers(userSet);

        
// 啓動Session
        Session session = HibernateSessionFactory.getSession();
        
// 啓動事務
        Transaction tx = session.beginTransaction();
        
// 持久化room實體
        
//此時將更新表room和userinfo以及維護關係的roomusers表
        session.save(room);
        tx.commit();
        HibernateSessionFactory.closeSession();
        
        
// 啓動Session
        session = HibernateSessionFactory.getSession();
        
// 啓動事務
        tx = session.beginTransaction();
        
        
//獲取Room實體以成爲持久化狀態,此時將獲取room表的所有字段信息
        Room roomF1 = (Room)session.get(Room.class, room.getId());
        
        
//通過外連接roomusers獲取userinfo表對應字段信息
        Iterator<Userinfo> iF1 = roomF1.getUsers().iterator();
        
while(iF1.hasNext()) 
            Userinfo userF 
= iF1.next();
            System.out.println(userF.getId());
            System.out.println(userF.getName());
            System.out.println(userF.getSex());
        }

        
        Room roomF2 
= (Room)session.get(Room.class, room2.getId());
        
        Iterator
<Userinfo> iF2 = roomF2.getUsers().iterator();
        
while(iF1.hasNext()) 
            Userinfo userF 
= iF2.next();
            System.out.println(userF.getId());
            System.out.println(userF.getName());
            System.out.println(userF.getSex());
        }

        
        tx.commit();
        HibernateSessionFactory.closeSession();
    }


    
public static void main(String[] args) {
        Demo demo 
= new Demo();
        demo.test();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章