Hibernate多对一的处理

    技术2022-05-11  65

    一个学生住在一个宿舍里面,一个宿舍里面住着多个学生。学生是多放,把少反(宿舍)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(); 


    最新回复(0)