架构师之路

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  4 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

所有配置文件都要放在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了

 

posted on 2005-12-20 16:20 月-风 阅读(851) 评论(1)  编辑  收藏 所属分类: hibernate

Feedback

# re: Hibernate学习笔记 2006-10-02 11:57 都市雏鹰
我遇见一种many -to-one双向关联:
报出这样错误:a different object with the same identifier value was already associated with the session
,后来发现没有建立双指向:
就是
one.setMany(many)没有建立many.getXXX().add(one).
但是并没有设置:unsaved-value="0"

  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: