﻿<?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-liuzheng-文章分类-Hibernate</title><link>http://www.blogjava.net/liuzheng/category/24701.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 25 Apr 2008 12:45:25 GMT</lastBuildDate><pubDate>Fri, 25 Apr 2008 12:45:25 GMT</pubDate><ttl>60</ttl><item><title>Hibernate 的中文参考文档</title><link>http://www.blogjava.net/liuzheng/articles/195186.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Wed, 23 Apr 2008 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/195186.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/195186.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/195186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/195186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/195186.html</trackback:ping><description><![CDATA[<p align="right">&nbsp;</p>
http://docs.huihoo.com/framework/hibernate/reference-v3_zh-cn/<br />
Hibernate 的中文参考文档
<img src ="http://www.blogjava.net/liuzheng/aggbug/195186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2008-04-23 17:42 <a href="http://www.blogjava.net/liuzheng/articles/195186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Hibernate中关于对复合主键的映射和处理</title><link>http://www.blogjava.net/liuzheng/articles/150675.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Sat, 06 Oct 2007 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/150675.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/150675.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/150675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/150675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/150675.html</trackback:ping><description><![CDATA[在Hibernate中关于对复合主键的映射和处理：<br />
<br />
<br />
<br />
例子：<br />
<br />
&lt;class name="User" table="USER"&gt;<br />
&lt;composite-id name="userId" class="<span style="color: red">UserId</span>"&gt;<br />
&lt;key-property name="userName"<br />
column="USERNAME"/&gt;<br />
&lt;key-property name="organizationId"<br />
column="ORGANIZATION_ID"/&gt;<br />
&lt;/composite-id&gt;<br />
&lt;version name="version"<br />
column="VERSION"<br />
unsaved-value="0"/&gt;<br />
&lt;many-to-one name="organization"<br />
class="Organization"<br />
column="ORGANIZATION_ID"<br />
insert="false" update="false"/&gt;<br />
...<br />
&lt;/class&gt;<br />
public class <span style="color: red">UserId </span>extends Serializable {<br />
private String username;<br />
private String organizationId;<br />
public UserId(String username, String organizationId) {<br />
this.username = username;<br />
this.organizationId = organizationId;<br />
}<br />
// Getters...<br />
public boolean equals(Object o) {<br />
<span style="color: red">if (this == o) return true;<br />
if (o = null) return false;<br />
if (!(o instanceof UserId)) return false;----一般的判断开头都基本这样写</span><br />
final UserId userId = (UserId) o;<br />
if (!organizationId.equals(userId.getOrganizationId()))<br />
return false;<br />
if (!username.equals(userId.getUsername()))<br />
return false;<br />
return true;<br />
}<br />
public int hashCode() {<br />
return username.hashCode();<br />
)<br />
}<br />
使用如下：<br />
<br />
UserId id = new UserId("john", 42);<br />
User user = new User();<br />
// Assign a primary key value<br />
user.setUserId(id);<br />
// Set property values<br />
user.setFirstname("John");<br />
user.setLastname("Doe");<br />
session.saveOrUpdate(user); // will save, since version is 0<br />
session.flush();
<img src ="http://www.blogjava.net/liuzheng/aggbug/150675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-10-06 11:37 <a href="http://www.blogjava.net/liuzheng/articles/150675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中有关Interceptor的学习</title><link>http://www.blogjava.net/liuzheng/articles/145471.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Sun, 16 Sep 2007 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/145471.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/145471.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/145471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/145471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/145471.html</trackback:ping><description><![CDATA[可以使用Hibernate的Interceptor对数据稽核，它避免了使用Lifecycle对Hibernate 的依赖。减少了Hibernate的侵入性。<br />
使用sessionFactory.openSession(interceptor)<br />
使其与session相关联。<br />
<br />
但是常用的还是他的adaptor类EmptyInterceptor。我们只需要extends EmptyInterceptor，然后针对我们想要的方法进行override。<br />
<br />
<br />
注意：Lifecycle和Interceptor都不能调用当前的session进行操作，因为他们接口中定义的方法都是由当前session负责调用的，如果在这些方法中又调用了当前session的话，就会导致管理混乱。解决方法有两种：1。创建一个新的session。但是两个不同的session独占两个数据库连接，完成一个操作，对并发量大的系统来说是个奢侈。2。重用当前数据库连接。使用session.connection()传递一个JDBC的Connection，然后tempSession=sessionFactory.openSession(connection)，这样虽然是两个session，但是只有一个数据库连接，由于是共享数据库连接，那么tempSession就不需要进行close()了<br />
<img src ="http://www.blogjava.net/liuzheng/aggbug/145471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-09-16 10:22 <a href="http://www.blogjava.net/liuzheng/articles/145471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中Query查询问题</title><link>http://www.blogjava.net/liuzheng/articles/145382.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Sat, 15 Sep 2007 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/145382.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/145382.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/145382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/145382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/145382.html</trackback:ping><description><![CDATA[from Item item<br />
join item.bids bid<br />
where item.description like '%gc%'<br />
and bid.amount &gt; 100<br />
<br />
这样得出来的是两个对象<br />
item 和bid<br />
<br />
通过这样进行查询<br />
Query q = session.createQuery("from Item item join item.bids bid");<br />
Iterator pairs = q.list().iterator();<br />
Joining associations 263<br />
while ( pairs.hasNext() ) {<br />
Object[] pair = (Object[]) pairs.next();<br />
Item item = (Item) pair[0];<br />
Bid bid = (Bid) pair[1];<br />
}<br />
<br />
<br />
如果是<br />
select item<br />
from Item item<br />
join item.bids bid<br />
where item.description like '%gc%'<br />
and bid.amount &gt; 100<br />
那么只得出的是一个对象
<img src ="http://www.blogjava.net/liuzheng/aggbug/145382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-09-15 16:14 <a href="http://www.blogjava.net/liuzheng/articles/145382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate数据加载方式</title><link>http://www.blogjava.net/liuzheng/articles/145379.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Sat, 15 Sep 2007 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/145379.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/145379.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/145379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/145379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/145379.html</trackback:ping><description><![CDATA[Hibernate数据加载方式有四种：<br />
<br />
<br />
1。立即加载<br />
2。延迟加载<br />
3。预先加载<br />
4。批量加载<br />
<br />
<br />
对于延迟加载可以设置lazy="true"<br />
对于预先加载可以在HQL中使用out join 或者使用left join fetch XXX，使其加载<br />
<img src ="http://www.blogjava.net/liuzheng/aggbug/145379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-09-15 15:55 <a href="http://www.blogjava.net/liuzheng/articles/145379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的Persistent Object的深入理解</title><link>http://www.blogjava.net/liuzheng/articles/144914.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Thu, 13 Sep 2007 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/144914.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/144914.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/144914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/144914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/144914.html</trackback:ping><description><![CDATA[持久态对象是与session相关联的，<br />
只要session.save（object），这个object便成为了持久态对象。<br />
<br />
注意session 是轻量级的，他甚至不会得到JDBC Connection<br />
<br />
当运行save时，一个对象便与session相关联了，但是这个时候，并没有任何SQL语句执行，只有当session.flush()或事务transaction.commit()时，Hibernate得到一个JDBC Connection，才真正的执行SQL语句，这里意味着在save之后，你还能对对象进行修改。<br />
<br />
update（）也同理。<br />
<img src ="http://www.blogjava.net/liuzheng/aggbug/144914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-09-13 17:09 <a href="http://www.blogjava.net/liuzheng/articles/144914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中一对多和多对一的配置</title><link>http://www.blogjava.net/liuzheng/articles/144836.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Thu, 13 Sep 2007 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/144836.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/144836.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/144836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/144836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/144836.html</trackback:ping><description><![CDATA[一对多：<br />
<br />
&lt;set name="bids" inverse="true"&gt;--------------set表示集合&nbsp; name为集合名也是javabean中的一个property<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;key column="ITEM_ID"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------key表示的为外健 column表示对应的字段<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;one-to-many class="Bid"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-------------所对应的class<br />
&lt;/set&gt;<br />
<br />
inverse避免update ITEM_ID=XXX from Y where ITEM_ID=XXXX<br />
这样无意义的SQL语句<br />
<br />
多对一：<br />
&lt;many-to-one<br />
name="item"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----javabean中的一个property<br />
column="ITEM_ID"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--在数据库中所对应的column<br />
class="Item"<br />
not-null="true"/&gt; <br />
<br />
所以在hibernate中都是双向配置，在one to many 一方设置inverse="true"<br />
这样的话，在多方就要自己管理和一方的联系，<br />
所以在插入数据的时候就要 ，多方.add(一方)
<img src ="http://www.blogjava.net/liuzheng/aggbug/144836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-09-13 13:40 <a href="http://www.blogjava.net/liuzheng/articles/144836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关hibernate中的subclass的映射</title><link>http://www.blogjava.net/liuzheng/articles/144778.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Thu, 13 Sep 2007 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/144778.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/144778.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/144778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/144778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/144778.html</trackback:ping><description><![CDATA[第一种方法：使用一张表并且使用一个字段表明不同的subclass<br />
&lt;discriminator<br />
column="XXXXX"<br />
type="XXXX"/&gt;<br />
表示subclass的不同的地方，<br />
column="XXXXX"为数据库中的区分column<br />
如：<br />
<br />
&lt;discriminator<br />
column="BILLING_DETAILS_TYPE"<br />
type="string"/&gt;<br />
&lt;subclass<br />
name="CreditCard"<br />
discriminator-value="CC"&gt;<br />
&lt;property<br />
name="type"<br />
column="CREDIT_CARD_TYPE"/&gt;<br />
...<br />
&lt;/subclass&gt;<br />
第二种方法：使用多张表并且使用主外健关系<br />
<br />
&lt;joined-subclass<br />
name="CreditCard"<br />
table="CREDIT_CARD"&gt;<br />
&lt;key column="CREDIT_CARD_ID"&gt;----------<span style="color: red">外健<br />
</span>&lt;property<br />
name="type"<br />
column="TYPE"/&gt;<br />
...<br />
&lt;/joined-subclass&gt; <br />
<br />
第二种方式由于涉及到外健关系相联，在取数据的时候会对数据库资源的要求很高
<img src ="http://www.blogjava.net/liuzheng/aggbug/144778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-09-13 11:17 <a href="http://www.blogjava.net/liuzheng/articles/144778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate中对象的3种状态----瞬时态、持久态、脱管态 </title><link>http://www.blogjava.net/liuzheng/articles/143129.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Thu, 06 Sep 2007 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/143129.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/143129.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/143129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/143129.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/143129.html</trackback:ping><description><![CDATA[Hibernate的对象有3种状态，分别为：瞬时态(Transient)、&nbsp;持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object)，瞬时对象和脱管对象也称为VO（Value Object）。
<ul>
    <li><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 瞬时态</strong></li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由new命令开辟内存空间的java对象，</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg. Person person = new Person("amigo", "女");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果没有变量对该对象进行引用，它将被java虚拟机回收。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;瞬时对象在内存孤立存在，它是携带信息的载体，不和数据库的数据有任何关联关系，在Hibernate中，可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联，并将数据对应的插入数据库中，此时该瞬时对象转变成持久化对象。</p>
<ul>
    <li><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 持久态</strong></li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 处于该状态的对象在数据库中具有对应的记录，并拥有一个持久化标识。如果是用hibernate的delete()方法，对应的持久对象就变成瞬时对象，因数据库中的对应数据已被删除，该对象不再与数据库的记录关联。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个session执行close()或clear()、evict()之后，持久对象变成脱管对象，此时持久对象会变成脱管对象，此时该对象虽然具有数据库识别值，但它已不在HIbernate持久层的管理之下。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 持久对象具有如下特点：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. 和session实例关联；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 在数据库中有与之关联的记录。</p>
<ul>
    <li><strong>&nbsp;脱管态</strong></li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当与某持久对象关联的session被关闭后，该持久对象转变为脱管对象。当脱管对象被重新关联到session上时，并再次转变成持久对象。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 脱管对象拥有数据库的识别值，可通过update()、saveOrUpdate()等方法，转变成持久对象。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 脱管对象具有如下特点：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.&nbsp; 本质上与瞬时对象相同，在没有任何变量引用它时，JVM会在适当的时候将它回收；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;&nbsp;比瞬时对象多了一个数据库记录标识值。</p>
<img src ="http://www.blogjava.net/liuzheng/aggbug/143129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-09-06 11:44 <a href="http://www.blogjava.net/liuzheng/articles/143129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>