Hibernate多对一 的处理

一个学生住在一个宿舍里面,一个宿舍里面住着多个学生。学生是多放,把少反(宿舍)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;
[color=green] private Room room;[/color]
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也会增加一行的意思-->
[color=green] <many-to-one name="room"
column="room_id"
class="MulToOne.Room"
cascade="all"
outer-join="true"/> [/color]
</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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值