﻿<?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-成长中的记忆-文章分类-Hiberntea</title><link>http://www.blogjava.net/aiyoyoyo/category/7536.html</link><description>这是我的成长，这是我的天地，学习JAVA，只因快乐。</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:25:30 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:25:30 GMT</pubDate><ttl>60</ttl><item><title>Hibernate配置手册 </title><link>http://www.blogjava.net/aiyoyoyo/articles/76102.html</link><dc:creator>aiyoyoyo</dc:creator><author>aiyoyoyo</author><pubDate>Thu, 19 Oct 2006 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/aiyoyoyo/articles/76102.html</guid><wfw:comment>http://www.blogjava.net/aiyoyoyo/comments/76102.html</wfw:comment><comments>http://www.blogjava.net/aiyoyoyo/articles/76102.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/aiyoyoyo/comments/commentRss/76102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aiyoyoyo/services/trackbacks/76102.html</trackback:ping><description><![CDATA[
		<br />
		<table cellspacing="0" cellpadding="0" width="95%" border="0">
				<tbody>
						<tr>
								<td align="middle" width="100%">
										<font size="3">
												<b>Hibernate配置手册</b>
										</font>
								</td>
						</tr>
						<tr>
								<td class="text9pt" align="middle" width="100%">
										<hr width="50%" noshade="" size="1" />
										<font size="+0">源作者：波波 </font>
								</td>
						</tr>
						<tr>
								<td align="right" width="100%" height="10">
								</td>
						</tr>
						<tr>
								<td width="100%">
										<table width="90%" align="center" border="0">
												<tbody>
														<tr>
																<td class="text9pt">
																		<table align="right" border="0">
																				<tbody>
																						<tr>
																								<td width="100%" height="10">
																										<script language="javascript" src="http://usms.tom.com/wlqy_flash.js?tomuserid=9247">
																										</script>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<p>Hibernate.cfg.xml配置文件：<br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "hibernate-configuration-2.0.dtd"&gt;<br />&lt;hibernate-configuration&gt;<br />    &lt;session-factory&gt;<br />        &lt;!-- properties --&gt;<br />        &lt;!-- jndi --&gt;<br />        &lt;property name="connection.datasource"&gt;java:comp/env/jdbc/quickstart&lt;/property&gt;<br />        &lt;property name="connection.provider_class"&gt;net.sf.hibernate.connection.DatasourceConnectionProvider&lt;/property&gt;<br />        &lt;property name="dialect"&gt;net.sf.hibernate.dialect.SQLServerDialect&lt;/property&gt;<br />        &lt;!-- jdbc<br />        &lt;property name="connection.url"&gt;jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=pubs&lt;/property&gt;<br />        &lt;property name="connection.driver_class"&gt;com.microsoft.jdbc.sqlserver.SQLServerDriver&lt;/property&gt;<br />        &lt;property name="connection.username"&gt;sa&lt;/property&gt;<br />        &lt;property name="connection.password"&gt;&lt;/property&gt;<br />         --&gt;<br />        &lt;property name="jdbc.fetch_size"&gt;50&lt;/property&gt;&lt;!-- 一次读的数据库记录数 --&gt;<br />        &lt;property name="jdbc.batch_size"&gt;30&lt;/property&gt;&lt;!-- 设定对数据库进行批量删除 --&gt;<br />        &lt;property name="show_sql"&gt;true&lt;/property&gt;&lt;!-- 将Hibernate发送给数据库的sql显示出来 --&gt;<br />        &lt;!-- Mapping files --&gt;<br />        &lt;mapping resource="cat.hbm.xml"/&gt;<br />    &lt;/session-factory&gt;<br />&lt;/hibernate-configuration&gt;</p>
																		<br />
																		<p>数据库表主键的知识点：<br />Generator 为每个 POJO 的实例提供唯一标识。一般情况，我们使用“native”。class 表示采用由生成器接口net.sf.hibernate.id.IdentifierGenerator 实现的某个实例，其中包括：</p>
																		<br />
																		<p>“assigned”<br />主键由外部程序负责生成，在 save() 之前指定一个。</p>
																		<br />
																		<p>“hilo”<br />通过hi/lo 算法实现的主键生成机制，需要额外的数据库表或字段提供高位值来源。</p>
																		<br />
																		<p>“seqhilo”<br />与hilo 类似，通过hi/lo 算法实现的主键生成机制，需要数据库中的 Sequence，适用于支持 Sequence 的数据库，如Oracle。</p>
																		<br />
																		<p>“increment”<br />主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量，以保存着当前的最大值，之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是：不能在集群下使用。</p>
																		<br />
																		<p>“identity”<br />采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。</p>
																		<br />
																		<p>“sequence”<br />采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。</p>
																		<br />
																		<p>“native”<br />由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。 </p>
																		<br />
																		<p>“uuid.hex”<br />由 Hibernate 基于128 位 UUID 算法 生成16 进制数值（编码后以长度32 的字符串表示）作为主键。</p>
																		<br />
																		<p>“uuid.string”<br />与uuid.hex 类似，只是生成的主键未进行编码（长度16），不能应用在 PostgreSQL 数据库中。</p>
																		<br />
																		<p>“foreign”<br />使用另外一个相关联的对象的标识符作为主键。</p>
																		<br />
																		<p>以下举例：<br />1、指定参数的情况：<br />    &lt;id name="id" unsaved-value="0"&gt; <br />      &lt;generator class="sequence"&gt;<br />        &lt;param name="sequence"&gt;SEQ_CHILD&lt;/param&gt;<br />      &lt;/generator&gt;<br />&lt;/id&gt;<br />使用的是sequence，适合oracle数据库；</p>
																		<br />
																		<p>2、对于sql server2000中的数据库子增字段,在配置文件使用下列方法实现：<br />&lt;id name="id" type="long" unsaved-value="0"&gt;<br />     &lt;column name="id" sql-type="numeric" not-null="true" /&gt;<br />     &lt;generator class="identity" /&gt; <br />&lt;/id&gt;<br />这里主要是:identity:代表由sql server2000数据库自己提供子增字段.如果要hibernate自己提供,则用increment关键字来实现</p>
																		<br />
																		<p>3、如果表中的主键用字符串类型:可以用hibernate自己提供的方法实现主键唯一:<br />  &lt;id name="id" type="string" unsaved-value="null"&gt;<br />      &lt;column name="cid" sql-type="char(32)" not-null="true" /&gt;<br />      &lt;generator class="uuid.hex" /&gt;<br />  &lt;/id&gt;<br />使用的是uuid.hex: 采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库。</p>
																		<br />
																		<p>重要的知识点:<br />1. 如果有部门表,有员工表,员工表中有dep_id,则表部门类和员工类是one-to-many的关系:<br />   可以使用:  ( 在部门类department中使用下列)<br />   Department类:  <br />     /**  部门的所有员工   */<br />    private Set staffs = new TreeSet();<br />    <br />    xml的文件:<br />      &lt;set name="staffs" &gt;<br />          &lt;key column="dep_id"/&gt;<br />          &lt;one-to-many class="hbp.sys.data.Staff"/&gt;<br />      &lt;/set&gt;<br />      如果是list,需要用索引&lt;index&gt; &lt;/index&gt;,具体其中的含义,不是很明白.待以后研究<br />      <br /> 2. 如果部门要有一个负责人,即部门表(tb_department)中有一个字段:staff_id.<br />     那么表示部门和负责人之间的关系是many-to-one的关系<br />     Department类: <br />      /** 部门负责人id */<br />    private Staff staff;<br />    <br />    xml 文件<br />     &lt;many-to-one name="staff" class="hbp.sys.data.Staff"  column="staff_id"/&gt;  <br />  <br /> 3. 多对多关系,一般我们是做一个中间关联表.我用角色和权限做了个例子,<br />      Right(id,name)     Role(id,name)   中间表:tb_role_right(role_id,right_id)<br />      Right类中有一个Role的集合:private Set roles=new TreeSet();<br />      Role类中也有一个Right的集合:private Set rights=new TreeSet();<br />      则两者是明显的多对多关系.使用many-to-many来实现;<br />      xml文件中<br />      right.hbm.xml:如下:<br />        &lt;set name="roles" table="tb_role_right" cascade="all"&gt;<br />           &lt;key column="right_id"/&gt;<br />           &lt;many-to-many column="role_id" class="hbp.sys.data.Role"/&gt;<br />        &lt;/set&gt; <br />      role.hbm.xml文件中类似:<br />        &lt;set name="rights" table="tb_role_right" cascade="all"&gt;<br />          &lt;key column="role_id"/&gt;<br />          &lt;many-to-many column="right_id" class="hbp.sys.data.Right"/&gt;<br />        &lt;/set&gt; </p>
																		<br />
																		<p>4. 几个值得注意的问题:<br />        a)在xml?映射文件中,写类的名字时一定用类的全名:即:包+类名如:(hbp.sys.data.Staff),这个错误使我费了半天劲.:(<br />        b)我在写实现基本DAO操作时,写了<br />             session.delete("from Right as right where right.id="+id);  <br />             程序死活报错,我折腾了半天,跟踪到底,才恍然大悟,hibernate在解析sql语句的时候把<br />             其中的right,当成了数据库中的右连接("保留字"),唉,这种关键字,不能随便用啊,:)</p>
																		<br />
																		<p>5. hibernate中HQL语言的查询根据你的sql的不同而返回不同的对象类型.<br />         如果你使用session.find(String hql)<br />         一般会返回一个List,如:from Staff staff;返回的是包含所有的员工对象的集合<br />         如你的hql为:select count(*) from Staff staff;则返回的是一个Integer对象<br />         如果你使用的hql为:select count(distinct staff.name),count(*) from Staff staff;则返回的是一个Object<br />         即Object[],需要先把他转换成Object[],然后在取[0],[1].<br />         这种设计我不知道hibernate是如何处理的,感觉既好也不好.好的是可以使用一个find获得任意查询<br />         不好在于根据hql来处理返回结果,容易出错.</p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/aiyoyoyo/aggbug/76102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aiyoyoyo/" target="_blank">aiyoyoyo</a> 2006-10-19 11:07 <a href="http://www.blogjava.net/aiyoyoyo/articles/76102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>