分享

hibernate多对一关联映射

 连元武 2010-11-16
一个学生住在一个宿舍里面,一个宿舍里面住着多个学生。学生是多放,把少反(宿舍)primary key放入。
1。数据库的建立:
     CREATE TABLE room (
    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    address VARCHAR(100) NOT NULL default ''
    );
  CREATE TABLE user (
    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    name VARCHAR(100) NOT NULL default '',
    room_id INT(11)
  );
2。映射类的建立:
    package MulToOne;
/////////////////////////////////////////////////////////////////
public class Room {
    private Integer id;
    private String address;
   
    public Room() {
    }
   
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }   
   
    public String getAddress() {
        return address;
    }
   
    public void setAddress(String address) {
        this.address = address;
    }
}
/////////////////////////////////////////////////////////////////
package MulToOne;
public class User {
    private Integer id;
    private String name;
    private Room room;
    public User() {
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Room getRoom() {
        return room;
    }
    public void setRoom(Room room) {
        this.room = room;
    }  
}
3。这写类的匹配数据库配置文件
/////////////////////////////////////////////////////////
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate./hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="MulToOne.Room" table="room">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <property name="address"
                  column="address"
                  type="java.lang.String"/>
    </class>
</hibernate-mapping>
/////////////////////////////////////////////////////////
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate./hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="MulToOne.User" table="user">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <property name="name" column="name" type="java.lang.String"/>
       
        <!--这个room值得是User类的room属性-->
  <!--这个room_id值得是user表的room_id字段-->
  <!--这个class=有点像是type=-->
  <!--这个cascade="all",表示user表一变化,则room表也变化,这中间就有user插入一行,room也会增加一行的意思-->
  <many-to-one name="room"
                     column="room_id"
                     class="MulToOne.Room"
                     cascade="all"
                     outer-join="true"/>        
    </class>
</hibernate-mapping>
5。在hibernate.hbm.xml中加入两行:
     <mapping resource="MulToOne/Room.hbm.xml"/>
     <mapping resource="MulToOne/User.hbm.xml"/>
6。测试文件:
     package MulToOne;
import org.hibernate.*;
import org.hibernate.criterion.Expression;
/*
 在下面例子中,只要存取多方就可以了
 
 在Hibernate中是以映射文件中標籤上的cascade屬性來設定,預設上是none,以 多對一 中的範例來說,
 如果不設定cascade為true,則您必須分別對User實例與Room實例進行儲存,而不是本例子中所示的只对User
 这一多方进行存储。
    如下:
 <many-to-one name="room"
                     column="room_id"
                     class="MulToOne.Room"
                     cascade="all"
                     outer-join="true"/>
*/
class  TestRoomUser
{
 public static void main(String[] args)
 {
  TestRoomUser.testSave();
  TestRoomUser.testLoad();
 }
 public static void testSave()
 {
  Room room1 = new Room();
  room1.setAddress("96#");
  Room room2 = new Room();
  room2.setAddress("94#");
     
  User user1 = new User();
  user1.setName("yinbodotcc");
  user1.setRoom(room1);////////////////////
     
  User user2 = new User();
  user2.setName("Yang Anyin");
  user2.setRoom(room1);////////////////////
     
 
  Session session =util.HibernateUtil.getSessionFactory().getCurrentSession();
  Transaction tx = session.beginTransaction();
     
  session.save(user1); // 主控方操作,被控方也會對應操作
  session.save(user2);
 
     
  tx.commit();
  util.HibernateUtil.getSessionFactory().close();
 }

 public static void testLoad()
 {
      
 
  Session session =util.HibernateUtil.getSessionFactory().getCurrentSession();
  Transaction tx = session.beginTransaction();//现在的load必须要事务。
  User user = (User) session.load(User.class, new Integer(1));//找不到时候,会报异常发生。
  if(user!=null)
  {
   System.out.println(user.getName());
   System.out.println(user.getRoom().getAddress());
  }
  tx.commit();
  util.HibernateUtil.getSessionFactory().close();
 }
}
说明的是,这里的util.HibernateUtil类,在以前的Hibernate学习中已经给出过,SessionFactory的获取方法为:
sessionFactory = new Configuration().configure().buildSessionFactory();
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yinbodotcc/archive/2007/02/08/1505445.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多