Hibernate多对一实例

来源:互联网 发布:ubuntu终端安装软件 编辑:程序博客网 时间:2024/05/17 04:42

一个学生住在一个宿舍里面,一个宿舍里面住着多个学生。

1.实体关系的建立:

2.据库配置文件

<?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>

3.在hibernate.hbm.xml中加入两行:
     <mapping resource="MulToOne/Room.hbm.xml"/>
     <mapping resource="MulToOne/User.hbm.xml"/>

4.测试文件

/*

 在下面例子中,只要存取多方就可以了
 在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();
 }
}