﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-架构师之路-随笔分类-hibernate</title><link>http://www.blogjava.net/jdoom/category/6198.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:50:28 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:50:28 GMT</pubDate><ttl>60</ttl><item><title>Hibernate学习笔记</title><link>http://www.blogjava.net/jdoom/archive/2005/12/20/24812.html</link><dc:creator>月-风</dc:creator><author>月-风</author><pubDate>Tue, 20 Dec 2005 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/jdoom/archive/2005/12/20/24812.html</guid><wfw:comment>http://www.blogjava.net/jdoom/comments/24812.html</wfw:comment><comments>http://www.blogjava.net/jdoom/archive/2005/12/20/24812.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jdoom/comments/commentRss/24812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jdoom/services/trackbacks/24812.html</trackback:ping><description><![CDATA[<P><FONT size=2>所有配置文件都要放在classes下面</FONT></P>
<P><FONT size=2>一:创建hibernate.cfg.xml文件，内容如下:<BR>&lt;?xml version='1.0' encoding='utf-8'?&gt;<BR>&lt;!DOCTYPE hibernate-configuration<BR>&nbsp;&nbsp;&nbsp; PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"<BR>&nbsp;&nbsp;&nbsp; "</FONT><A href="http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"><FONT size=2>http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd</FONT></A><FONT size=2>"&gt;</FONT></P>
<P><FONT size=2>&lt;hibernate-configuration&gt;<BR></FONT><FONT size=2>&nbsp;&nbsp;&nbsp; &lt;session-factory&gt;<BR></FONT><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.datasource"&gt;java:comp/env/note&lt;/property&gt; 连接池用，如在TOMCAT里配置连接池。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="show_sql"&gt;true&lt;/property&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="dialect"&gt;net.sf.hibernate.dialect.MySQLDialect&lt;/property&gt; 如果使用mysql就这样，如果是其他就根据hi..property文件配置</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Mapping files --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mapping resource="User.hbm.xml"/&gt;<BR>&nbsp;&nbsp;&lt;mapping resource="Passwd.hbm.xml"/&gt;&nbsp; 这里是需要映射的hbm文件<BR></FONT><FONT size=2>&nbsp;&nbsp;&nbsp; &lt;/session-factory&gt;<BR></FONT><FONT size=2>&lt;/hibernate-configuration&gt;</FONT></P>
<P><FONT size=2>二: One-To-One关系<BR>1):主表的hbm.xml文件应该加:<BR>&nbsp; &lt;one-to-one name="passwd" class="web.model.vo.passwdBean"&nbsp; cascade="save-update"/&gt; #class是子表的类<BR>2):子表的hbm.xml文件如下:<BR>&nbsp; &lt;one-to-one name="user" class="web.model.vo.userBean" constrained="true" /&gt; #class是主表的<BR>3):每个bean都要有get,set各自的子类和主类.<BR>4):在调用的时候执行:<BR>&nbsp;&nbsp;&nbsp;&nbsp; user.setPasswd(passwd);<BR>&nbsp;&nbsp;&nbsp;&nbsp; passwd.setUser(user);<BR>&nbsp;&nbsp;&nbsp;&nbsp; session.save(user); //只需要保存主类<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;三:many-to-one关系(单向关联)<BR>&nbsp;1):多数据这边一定要多一个字段好关联主表ID，比如一个房间对多个学生:<BR>&nbsp;room表:id,address<BR>&nbsp;student表:id,name,pid(这个字段关联room表的id),pid必须为可以为空<BR>&nbsp;2):在student.hbm.xml的关系为:<BR>&nbsp;&lt;many-to-one name="room"&nbsp; column="pid"&nbsp; class="web.model.vo.RoomBean" cascade="save-update/&gt;<BR>&nbsp;&nbsp;&nbsp; 如果设置了cascade(联级持久)那么只需要save(student) 而不用save(room)了，这表示当我们插入或更新Student时，自动对其所关联到的Room进行持久化<BR>&nbsp;&nbsp;&nbsp; 在student.hbm.xml里不能写进pid的描述<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;4):在room.hbm.xml里只需要设置字段对应的属性而已,如果用了cascade，必须在：<BR>&nbsp; &lt;id name="id" column="id" unsaved-value="0"&gt; 这里加个unsaved-value="0",不然会出如下错误:<BR>&nbsp;&nbsp; javax.servlet.ServletException: a different object with the same identifier value was already associated with the session: 0,<BR>&nbsp;&nbsp; of class: web.model.vo.RoomBean<BR>&nbsp;3):在测试里，先保存主类(room,也就是one这方),在保存many这方。<BR>&nbsp;4):在studentBean中不需要pid的set,get方法,而需要一个对主类的set,get，如:setRoom(RoomBean xx),getRoom()</FONT></P>
<P><BR><FONT size=2>&nbsp;四:many-to-one关系(双向关联)<BR>&nbsp;1):在one(student)这方加入set,比如setStudents(Set x),getStudents();<BR>&nbsp;2):在many(room)的room.hbm.xml为:<BR>&nbsp;&nbsp; &lt;set name="user" table="user" inverse="true" cascade="all"&gt; 这里inverse一定要为true，意思是关联由对方(student)维护;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key column="pid"/&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="web.model.vo.UserBean"/&gt; <BR>&nbsp;&nbsp; &lt;/set&gt;<BR>&nbsp;&nbsp; 注意这两个hbm.xml的ID处都必须加上unsaved-value="0"<BR>&nbsp;3)客户端程序改为:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RoomBean room1 = new RoomBean();<BR>&nbsp;&nbsp;room1.setAddress("chengdu");&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;UserBean user = new UserBean();<BR>&nbsp;&nbsp;user.setName("raoqn");<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;UserBean user2 = new UserBean();<BR>&nbsp;&nbsp;user2.setName("liping");<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;UserBean user3 = new UserBean();<BR>&nbsp;&nbsp;user3.setName("yrq");</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;user.setRoom(room1);&nbsp; //这里由于关系由user类维护，所以必须setRoom<BR>&nbsp;&nbsp;user2.setRoom(room1);<BR>&nbsp;&nbsp;user3.setRoom(room1);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;room1.getUser().add(user);<BR>&nbsp;&nbsp;room1.getUser().add(user2);<BR>&nbsp;&nbsp;room1.getUser().add(user3);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;session.save(room1); //只需要保存room1就搞定一切,不用每个对象都save了</FONT></P>
<P><FONT size=2>&nbsp;</FONT></P><img src ="http://www.blogjava.net/jdoom/aggbug/24812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jdoom/" target="_blank">月-风</a> 2005-12-20 16:20 <a href="http://www.blogjava.net/jdoom/archive/2005/12/20/24812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>