`
KuangYeYaZi
  • 浏览: 52700 次
文章分类
社区版块
存档分类
最新评论

Hibernate入门之多对一实体映像

 
阅读更多

多对一实体映像
 一个实体简单的说就是在数据库中拥有一个表格的对象,并拥有自已的数据库识别(database identity),之前介绍的Component对象并不是实体,它没有自已的数据库识别,具体的话,它没有id属性,Hibernate并不会赋予它id值。 
 实体与实体之间的关系有:一对一、多对一、一对多、多对多。其中多对一算是最常见的实体关系,举个简单的例子,假设您在撰写一个宿舍管理系统,一般来说,房客与房间之间的关系就是一种多对一的关系,因为一间房间可以分配给多个人(学生宿舍啦,一般应该都是二到八个人不等吧!看学校的环境了)。 
 用程序来表示的话,首先看看Room类别的撰写,我们只简单的设定地址属性于其中:

Room.java 

package onlyfun.caterpillar; 

public class Room { 
private long id; 
private String address; 

public long getId() { 
return id; 
} 
public void setId(long id) { 
this.id = id; 
} 
public String getAddress() { 
return address; 
} 
public void setAddress(String address) { 
this.address = address; 
} 
} 

 

注意这个类别与Component对象不同的是,它拥有id属性,在储存至数据库,Hibernate会赋予值给它;房客的话我们设计一个User类别:

User.java  

package onlyfun.caterpillar; 

public class User { 
private long id; 
private String name; 
private Room room; 

public long getId() { 
return id; 
} 
public void setId(long 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; 
} 
} 

 在Java中,一个Room对象可以被多个User对象参考,也就是说User对Room的关系是多对一的关系,我们也可以反过来设计Room对 User的关系,将其设计为一对多,这在下一个主题中讨论,现阶段我们先关注多对一的映射,我们的Room映射文件Room.hbm.xml很简单,如下: 

Room.hbm.xml 

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping 
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 

<hibernate-mapping> 

<class name="onlyfun.caterpillar.Room" table="ROOM"> 

<id name="id" column="ROOM_ID"> 
<generator class="increment"/> 
</id> 

<property name="address" type="string"/> 
</class> 

</hibernate-mapping> 
 再来是User.hbm.xml的撰写,我们使用<many-to-one>来设定多对一映射关系,如下: 
User.hbm.xml 
<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping 
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 

<hibernate-mapping> 

<class name="onlyfun.caterpillar.User" table="USER"> 

<id name="id" column="USER_ID"> 
<generator class="increment"/> 
</id> 

<property name="name"> 
<column name="NAME" length="16" not-null="true"/> 
</property> 

<many-to-one name="room" 
column="ROOM_ID" 
class="onlyfun.caterpillar.Room"/> 
</class> 

</hibernate-mapping> 

 与User对应的USER表格是透过ROOM_ID的值参考至ROOM表格,当然,最重要的别忘了在hibernate.cfg.xml中指定映像文件的位置与名称: 

hibernate.cfg.xml 

<?xml version=‘1.0‘ encoding=‘big5‘?> 
<!DOCTYPE hibernate-configuration 
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"> 

<hibernate-configuration> 

<session-factory> 

...... 

<!-- 对象与数据库表格映像文件 --> 
<mapping resource="Room.hbm.xml"/> 
<mapping resource="User.hbm.xml"/> 

</session-factory> 

</hibernate-configuration> 

 我们用下面这个程序简单的测试一下储存的结果: 

HibernateTest.java 

import onlyfun.caterpillar.*; 
import net.sf.hibernate.*; 
import net.sf.hibernate.cfg.*; 

public class HibernateTest { 
public static void main(String[] args) throws HibernateException { 
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

Room room1 = new Room(); 
room1.setAddress("NTU-M8-419"); 
Room room2 = new Room(); 
room2.setAddress("NTU-G3-302"); 

User user1 = new User(); 
user1.setName("bush"); 
user1.setRoom(room1); 

User user2 = new User(); 
user2.setName("caterpillar"); 
user2.setRoom(room1); 

User user3 = new User(); 
user3.setName("momor"); 
user3.setRoom(room2); 

Session session = sessionFactory.openSession(); 
Transaction tx= session.beginTransaction(); 

session.save(room1); 
session.save(room2); 
session.save(user1); 
session.save(user2); 
session.save(user3); 

tx.commit(); 
session.close(); 

sessionFactory.close(); 
} 
} 

 直接来看看储存在数据库中是什么样子: 

mysql> select * from USER; 
+---------+-------------+---------+ 
| USER_ID | NAME | ROOM_ID | 
+---------+-------------+---------+ 
| 1 | bush | 1 | 
| 2 | caterpillar | 1 | 
| 3 | momor | 2 | 
+---------+-------------+---------+ 
3 rows in set (0.00 sec) 

mysql> select * from ROOM; 
+---------+------------+ 
| ROOM_ID | address | 
+---------+------------+ 
| 1 | NTU-M8-419 | 
| 2 | NTU-G3-302 | 
+---------+------------+ 
2 rows in set (0.00 sec) 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics