Hibernate多对一 的处理

来源:互联网 发布:如何开农村淘宝服务站 编辑:程序博客网 时间:2024/04/30 07: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.sourceforge.net/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.sourceforge.net/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(); 

原创粉丝点击