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