所有配置文件都要放在classes下面
一:创建hibernate.cfg.xml文件,内容如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.datasource">java:comp/env/note</property> 连接池用,如在TOMCAT里配置连接池。
<property name="show_sql">true</property>
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property> 如果使用mysql就这样,如果是其他就根据hi..property文件配置
<!-- Mapping files -->
<mapping resource="User.hbm.xml"/>
<mapping resource="Passwd.hbm.xml"/> 这里是需要映射的hbm文件
</session-factory>
</hibernate-configuration>
二: One-To-One关系
1):主表的hbm.xml文件应该加:
<one-to-one name="passwd" class="web.model.vo.passwdBean" cascade="save-update"/> #class是子表的类
2):子表的hbm.xml文件如下:
<one-to-one name="user" class="web.model.vo.userBean" constrained="true" /> #class是主表的
3):每个bean都要有get,set各自的子类和主类.
4):在调用的时候执行:
user.setPasswd(passwd);
passwd.setUser(user);
session.save(user); //只需要保存主类
三:many-to-one关系(单向关联)
1):多数据这边一定要多一个字段好关联主表ID,比如一个房间对多个学生:
room表:id,address
student表:id,name,pid(这个字段关联room表的id),pid必须为可以为空
2):在student.hbm.xml的关系为:
<many-to-one name="room" column="pid" class="web.model.vo.RoomBean" cascade="save-update/>
如果设置了cascade(联级持久)那么只需要save(student) 而不用save(room)了,这表示当我们插入或更新Student时,自动对其所关联到的Room进行持久化
在student.hbm.xml里不能写进pid的描述
4):在room.hbm.xml里只需要设置字段对应的属性而已,如果用了cascade,必须在:
<id name="id" column="id" unsaved-value="0"> 这里加个unsaved-value="0",不然会出如下错误:
javax.servlet.ServletException: a different object with the same identifier value was already associated with the session: 0,
of class: web.model.vo.RoomBean
3):在测试里,先保存主类(room,也就是one这方),在保存many这方。
4):在studentBean中不需要pid的set,get方法,而需要一个对主类的set,get,如:setRoom(RoomBean xx),getRoom()
四:many-to-one关系(双向关联)
1):在one(student)这方加入set,比如setStudents(Set x),getStudents();
2):在many(room)的room.hbm.xml为:
<set name="user" table="user" inverse="true" cascade="all"> 这里inverse一定要为true,意思是关联由对方(student)维护;
<key column="pid"/>
<one-to-many class="web.model.vo.UserBean"/>
</set>
注意这两个hbm.xml的ID处都必须加上unsaved-value="0"
3)客户端程序改为:
RoomBean room1 = new RoomBean();
room1.setAddress("chengdu");
UserBean user = new UserBean();
user.setName("raoqn");
UserBean user2 = new UserBean();
user2.setName("liping");
UserBean user3 = new UserBean();
user3.setName("yrq");
user.setRoom(room1); //这里由于关系由user类维护,所以必须setRoom
user2.setRoom(room1);
user3.setRoom(room1);
room1.getUser().add(user);
room1.getUser().add(user2);
room1.getUser().add(user3);
session.save(room1); //只需要保存room1就搞定一切,不用每个对象都save了