﻿<?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/wyxdeniro/category/27579.html</link><description>欲为诸佛龙象，必先做众生牛马</description><language>zh-cn</language><lastBuildDate>Sat, 02 Jan 2010 07:44:41 GMT</lastBuildDate><pubDate>Sat, 02 Jan 2010 07:44:41 GMT</pubDate><ttl>60</ttl><item><title>Hibernate深入浅出(二十五)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2010/01/02/308034.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Sat, 02 Jan 2010 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2010/01/02/308034.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/308034.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2010/01/02/308034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/308034.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/308034.html</trackback:ping><description><![CDATA[<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">&nbsp;com.hibernate.higherApplication;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.util.Iterator;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.util.List;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.util.Set;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;junit.framework.TestCase;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.Criteria;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.Hibernate;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.HibernateException;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.Query;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.Session;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.SessionFactory;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.cfg.Configuration;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.criterion.Expression;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;DurationOperator&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;TestCase&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;SessionFactory&nbsp;sessionFactory&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;Session&nbsp;session&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;初始化资源<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;setUp()&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">加载类路径下的hibernate.cfg.xml文件</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Configuration&nbsp;config&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Configuration().configure();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创建sessionFactory对象</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionFactory&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;config.buildSessionFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创建session</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;sessionFactory.openSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(HibernateException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;load/get方法均可以根据指定的实体类和id从数据库读取记录，并返回与之对应的实体对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;区别在于：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;1、如果未发现符合条件的记录，get方法返回null,而load方法抛出一个ObjectNotFoundException<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;2、load方法可以返回实体的代理类实例，而get方法永远直接返回实体类。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;3、load方法可以充分利用内部缓存和二级缓存中的现有数据，而get方法则仅仅在内部缓存中进行数据查找，如果<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;没有发现数据，将越过二级缓存，直接调用SQL完成数据读取。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;loadOrGetData(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;user&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(TUser)session.load(TUser.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Integer(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;查询性能往往是一系统性能表现的一个重要方面。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;query.list方法通过一条select&nbsp;SQL实现了查询操作，而iterate方法，则执行了3次selectSQL，第一次获取了所有符合条件的记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;的id,之后，在根据各个id从库表中读取对应的哦记录，这是一个典型的N+1次查询问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;我们进行query.list数据查询时，即使缓存中已经有一些符合条件的实体对象存在，我们也无法保证这些数据就是库表中所有符合条件的数据。假设<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;第一次查询条件是age&gt;25,随即缓存中就包括了所有age&gt;25的user数据;第二次查询条件为age&gt;20,此时缓存中虽然包含了满足age&gt;25d的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;数据，但这些并不是满足条件age&gt;20的全部数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;因此，query.list方法还是需要执行一次select&nbsp;sql以保证查询结果的完整性(iterate方法通过首先查询获取所有符合条件记录的id,以此保证<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;查询结果的完整性)。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;因此，query.list方法实际上无法利用缓存，它对缓存只写不读。而iterate方法则可以充分发挥缓存带来的优势，如果目标数据只读或者读取相对<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;较为频繁，通过这种机制可以大大减少性能上的损耗。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;queryForList(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hql&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">from&nbsp;TUser&nbsp;where&nbsp;age&gt;?</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;session.createQuery(hql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setInteger(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;query.list();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">list.size();i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;user&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(TUser)list.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">User&nbsp;age:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">user.getAge());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;queryForIterate(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hql&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">from&nbsp;TUser&nbsp;where&nbsp;age&gt;?</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;session.createQuery(hql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setInteger(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;query.iterate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(it.hasNext()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;user&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(TUser)it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">User&nbsp;age:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">user.getAge());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;大数据量的批量读取(10W条)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解决方案：结合iterate方法和evict方法逐条对记录进行处理，将内存消耗保持在可以接受的范围之内。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在实际开发中，对于大批量数据处理，还是推荐采用SQL或存储过程实现，以获得较高的性能，并保证系统平滑运行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;bigDataRead(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hql&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">from&nbsp;TUser&nbsp;where&nbsp;age&gt;?</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;session.createQuery(hql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setInteger(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">age</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;query.iterate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(it.hasNext()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;user&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(TUser)it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">将对象从一级缓存中移除</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.evict(user);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">二级缓存可以设定最大数据缓存数量，达到峰值时会自动对缓存中的较老数据进行废除，但是我们这里还是通过<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">编码指定将对象从二级缓存中移除，这有助保持缓存的数据有效性。</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionFactory.evict(TUser.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">,user.getId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Query&nbsp;Cache弥补了find方法的不足，QueryCache中缓存的SQL及其结果及并非永远存在，当Hibernate发现此SQL对应的库表发生变动，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;会自动将Query&nbsp;Cache中对应表的SQL缓存废除。因此Query&nbsp;Cache只在特定的情况下产生作用：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;1、完全相同的select&nbsp;SQL重复执行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;2、在2次查询之间，此select&nbsp;SQL对应的库表没有发生过改变。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;queryForQueryCache(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hql&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">from&nbsp;TUser&nbsp;where&nbsp;age&gt;?</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;session.createQuery(hql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setInteger(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">除了在这里设置QueryCache外，还要在hibernate.cfg.xml中进行设置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&lt;property&nbsp;name="hibernate.cache.use_query_cache"&gt;true&lt;/property&gt;</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setCacheable(</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;userList&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;query.list();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;所谓延迟加载，就是在需要数据的时候，才真正执行数据加载操作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;延迟加载实现主要针对：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;1、实体对象:通过class的lazy属性，我们可以打开实体对象的延迟加载功能。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;2、集合<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;queryForEntityLazy(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;session.createCriteria(TUser.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add(Expression.eq(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">name</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Erica</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;userList&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;criteria.list();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;user&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(TUser)userList.get(</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">虽然使用了延迟加载，但是我们可以通过hibernate的初始化方法进行强制加载，这样即使session关闭之后，关联的对象仍让可以使用</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate.initialize(user.getAddresses());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">User&nbsp;name=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">user.getAge());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;hset&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">user.getAddresses();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TAddresses&nbsp;addr&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(TAddresses)hset.toArray()[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(addr.getAddress());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;关闭资源<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;tearDown()&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">(HibernateException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/308034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2010-01-02 15:27 <a href="http://www.blogjava.net/wyxdeniro/archive/2010/01/02/308034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(二十四)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2010/01/02/308032.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Sat, 02 Jan 2010 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2010/01/02/308032.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/308032.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2010/01/02/308032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/308032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/308032.html</trackback:ping><description><![CDATA[&nbsp; 基于Java的缓存实现，最简单的方式莫过于对集合类数据类型进行封装。Hibernate提供了基于Hashtable的缓存实现机制，不过，由于其性能和功能上的局限，仅供开发调试中使用。同时，Hibernate还提供了面向第三方缓存实现的接口，如：<br />
HashTable--------------------------------net.sf.hibernate.cache.HashtableCacheProvider<br />
1、JSC<br />
2、EHCache-&gt;默认的二级Cache实现。--------net.sf.encache.hibernate.Provider<br />
3、OSCache-------------------------------net.sf.hibernate.cache.OSCacheProvider<br />
4、JBoss Cache-&gt;分布式缓存---------------net.sf.hibernate.cache.TreeCacheProvider<br />
5、SwarmCache----------------------------net.sf.hibernate.cache.SwarmCacheProvider<br />
相对于JSC而言，EHCache更加稳定，并具备更好的混存调度性能，其缺陷是目前还无法做到分布式缓存。<br />
首先设置hibernate.cfg.xml然后设置ehcache.xml最后设置缓存策略。<br />
<br />
&nbsp; 缓存同步策略决定了数据对象在缓存中的存取规则。为了使得缓存调度遵循正确的应用级事物隔离机制，我们必须为每个实体类指定相应的缓存同步策略。Hibernate提供4种内置的缓存同步策略：<br />
1、read-only:只读。对于不会发生改变的数据，可使用只读型缓存。<br />
2、nonstrict-read-write:如果程序对并发访问下的数据同步要求不是非常严格，且数据更新操作频率较低，可以采用本选项。<br />
3、read-write:严格可读写缓存。<br />
4、transactional:事务型缓存，必须运行在JTA事物环境中。<br />
<br />
&nbsp; JDBC事物由Connection管理，也就是说，事务管理实际上是在JDBC Connection中实现。事务周期限于Connection的生命周期之类。同样，对于基于JDBC Transaction的Hibernate事务管理机制而言，事物管理在Session所以托的JDBCConnection中实现，事务周期限于Session的生命周期。<br />
&nbsp; JTA事物管理则由JTA容器实现，JTA容器对当前加入事物的众多Connection进行调度，实现其事务性要求。JTA的事物周期可横跨多个JDBC Connectin生命周期。同样对于基于JTA事务的Hibernate而言，JTA事物横跨多个Session.<br />
<br />
&nbsp; Hibernate支持2种锁机制：即通常所说的悲观锁和乐观锁。<br />
&nbsp; 悲观锁的实现，往往依靠数据库提供的锁机制。典型的悲观锁调用：<br />
&nbsp; select * from account where name=="Erica" for update<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.hibernate.higherApplication;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.List;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;junit.framework.TestCase;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Criteria;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.HibernateException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.LockMode;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Query;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Session;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.SessionFactory;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Transaction;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.cfg.Configuration;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.criterion.Expression;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LockOperator&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;TestCase&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;初始化资源<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setUp()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">加载类路径下的hibernate.cfg.xml文件</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Configuration&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Configuration().configure();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">创建sessionFactory对象</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionFactory&nbsp;sessionFactory&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config.buildSessionFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">创建session</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sessionFactory.openSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(HibernateException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;悲观锁<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Hibernate的加锁模式有：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;1、LockMode.NONE:无锁机制<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;2、LockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;3、LockMode.READ:Hibernate在读取记录的时候会自动获取<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;上述3种锁机制为了保证update过程中对象不会被外界修改，在目标对象上加锁，与数据库无关<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;4、LockMode.UPGRADE:利用数据库的for&nbsp;update子句加锁<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;5、LockMode.UPGRADE_NOWAIT:oracle的特定实现<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;注意：只有在查询开始之前设定加锁，才会真正通过数据库的锁机制进行加锁处理。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addPessimismLock(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hqlStr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">from&nbsp;TUser&nbsp;as&nbsp;user&nbsp;where&nbsp;user.name='Erica'</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createQuery(hqlStr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setLockMode(</span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;">,LockMode.UPGRADE);</span><span style="color: #008000;">//</span><span style="color: #008000;">多所有返回的user对象加锁</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;userList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;query.list();</span><span style="color: #008000;">//</span><span style="color: #008000;">执行查询</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;乐观锁<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;数据版本：即为数据增加一个版本标识，在基于数据库表的版本解决方案中，一般是通过为数据库表增加一个version字段来实现。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;读取出数据时，将此版本号一同读出，之后更新时，对此版本号加1.此时，将提交数据的版本数据与数据库对应记录的当前版本信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;进行比对，如果提交的数据版本号大于数据库表当前版本号，则予以更新，否则认为是过期数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Hibernate在其数据访问引擎中内置了乐观锁实现。如果不考虑外部系统对数据库的更新操作，利用Hibernate提供的透明化乐观锁<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;实现，将大大提升我们的生产力。见配置文件T_USER.hbm.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;乐观锁机制避免了长事务中的数据加锁开销，大大提升了大并发量下的系统整体性能表象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addOptimismLock(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(TUser.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add(Expression.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">Erica</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;userList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;criteria.list();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(TUser)userList.get(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.beginTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setVersion(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;关闭资源<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;tearDown()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(HibernateException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
</span></div>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"http：//hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;none:无乐观锁<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version:通过版本机制实现乐观锁<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dirty:通过检查发生变动过的属性实现乐观锁<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all通过检查所有属性实现乐观锁<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="org.hibernate.sample.TUSER"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff;">="t_user"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic-update</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic-insert</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optimistic-lock</span><span style="color: #0000ff;">="version"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lazy</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">generator&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="native"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">generator</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">version&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="version"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="version"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">set&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="addresses"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff;">="t_address"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lazy</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inverse</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cascade</span><span style="color: #0000ff;">="all"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">key<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="user_id"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">key</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">one-to-many&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">=""</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">set</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/308032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2010-01-02 15:25 <a href="http://www.blogjava.net/wyxdeniro/archive/2010/01/02/308032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(二十三)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/12/22/306908.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Tue, 22 Dec 2009 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/12/22/306908.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/306908.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/12/22/306908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/306908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/306908.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 实体对象，特指Hibernate O/R映射关系中的域对象。实体对象生命周期中的3种状态<br />
&nbsp;&nbsp;&nbsp; 1、Transient(自由状态)：所谓Transient,即实体对象在内存中的自由存在，它与数据库中的记录无关。<br />
&nbsp;&nbsp;&nbsp; 2、Persistent(持久状态)：即实体对象处于由Hibernate框架所管理的状态。<br />
&nbsp;&nbsp;&nbsp; 3、Detached(游离状态)：处于Persistent状态的对象，其对应的Session实例关闭之后，那么，此对象就处于"Detached"状态。<br />
&nbsp;&nbsp;&nbsp; Transient状态的user对象与库表的数据缺乏对应关系，而Detached状态的user对象，却在库表中存在对应的记录，只不过由于Detached对象脱离了session这个数据操作平台，其状态的变化无法更新到库表中的对应记录。<br />
&nbsp;&nbsp;&nbsp; 处于Transient和Detached状态的对象统称为值对象(VO),而处于Persistent状态的对象称为持久对象(PO).这是站在实体对象是否被纳入Hibernate实体管理容器的立场加以区分的，非管理的实体对象统称为VO,而被管理的实体对象称为PO.<br />
VO与PO的主要区别在于：<br />
1、VO是相对独立的实体对象，处于非管理状态。<br />
2、PO是由Hibernate纳入其实体管理容器的对象，它代表了与数据库中某条记录对应的Hibernate实体，PO的变化在事务提交时将反映到实际数据库中<br />
3、如果一个PO与其对应的Session实例分离，那么此时，它又会变成一个VO。<br />
<br />
&nbsp;&nbsp;&nbsp; 不覆盖equals/hashCode方法的情况下我们要面对的问题：实体对象的跨session识别。解决办法一个是实现所谓的值比对，即在equals/hashCode方法中，对实体类的所有属性值进行比对.除了值比对，还有另外一种基于业务逻辑的对象判定方式业务关键信息判定。<br />
<br />
&nbsp;&nbsp;&nbsp; tx.commint();方法中会调用session.flush()方法，在flush()方法中会执行2个主要任务<br />
1、flushEverything();//刷新所有数据<br />
2、execute(0);//执行数据库SQL完成持久化动作。<br />
<br />
&nbsp;&nbsp;&nbsp; 数据缓存：在特定硬件基础上缓存往往是提升系统性能的关键因素。缓存是数据库数据在内存中的临时容器，它包含了库表数据在内存中的临时拷贝，位于数据库与数据访问层之间。ORM在进行数据读取时，会根据其缓存管理策略，首先在缓存中查询，如果在缓存中发现所需数据，则直接以此数据作为查询结果加以利用，从而避免了数据库调用的性能开销。<br />
&nbsp;&nbsp;&nbsp; 相对内存操作而言，数据库调用是一个代价高昂的过程，对于典型企业及应用结构，数据库往往与应用服务器位于不同的物理服务器，这也就意味着每次数据库访问都是一次远程调用，Socket的创建与销毁，数据的打包拆包，数据库执行查询命令，网络传输上的延时，这些消耗都给系统整体性能造成了严重影响。<br />
&nbsp;&nbsp;&nbsp; ORM的数据缓存应包含如下几个层次：<br />
1、事务级缓存：事务级缓存是基于Session生命周期实现的，每个Session会在内部维持一个数据缓存，此缓存随着Session的创建而存在，因此也成为Session Level Cache(内部缓存)<br />
2、应用级/进程级缓存：在某个应用中，或者应用中某个独立数据访问子集中的共享缓存。此缓存可由多个事物共享。在Hibernate中，应用级缓存在SessinFactory层实现，所有由此SessionFactory创建的Session实例共享此缓存。多实例并发运行的环境要特别小心进程级缓存的调用。<br />
3、分布式缓存：分布式缓存由多个应用级缓存实例组成集群，通过某种远程机制实现各个缓存实例间的数据同步，任何一个实例的数据修改操作，将导致整个集群间的数据状态同步。由于多个实例间的数据同步机制，每个缓存实例发生的变动都会复制到其余所有节点中，这样的远程同步开销不可忽视。<br />
<br />
&nbsp;&nbsp;&nbsp; Hibernate数据缓存分为2个层次，1、内部缓存2、二级缓存hibernate中，缓存将在以下情况中发挥作用：<br />
1、通过ID加载数据时<br />
这包括了根据id查询数据的Session.load方法，以及Session.ierate等批量查询方法<br />
2、延迟加载<br />
<br />
&nbsp;&nbsp;&nbsp; Session在进行数据查询操作时，会首先在自身内部的一级缓存中进行查找，如果一级缓存未能命中，则将在二级缓存中查询，如果二级缓存命中，则以此数据作为结果返回。<br />
&nbsp;&nbsp;&nbsp; 如果数据满足以下条件，则可将其纳入缓存管理<br />
1、数据不会被第三方应用修改<br />
2、数据大小在可接受的范围之内<br />
3、数据更新频率较低<br />
4、同一数据可能会被系统频繁引用<br />
5、非关键数据(关键数据，如金融账户数据)<br />
Hibernate本身并未提供二级缓存的产品化实现(只是提供了一个基于Hashtable的简单缓存以供调试)，而是为众多的第三方缓存组件提供了接入接口，我们可以根据实际情况选择不同的缓存实现版本。<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/306908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-12-22 15:01 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/12/22/306908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(二十二)-----读深入浅出hibernate有感 </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/21/303169.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Sat, 21 Nov 2009 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/21/303169.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/303169.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/21/303169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/303169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/303169.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; HQL作为Hibernate的查询语言，提供了ANSI SQL面向对象的封装形式。<br />
&nbsp;&nbsp;&nbsp; 与Criteria和HQL互为补充，Hibernate也提供了对原生SQL以及存储过程的支持，相对于JDBC的SQL操作，Hibernate提供了更为妥善的封装。代码如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.testproject.hibernate;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Iterator;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.hibernate.Query;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.hibernate.Session;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_177_682_Open_Image" onclick="this.style.display='none'; Codehighlighter1_177_682_Open_Text.style.display='none'; Codehighlighter1_177_682_Closed_Image.style.display='inline'; Codehighlighter1_177_682_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_177_682_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_177_682_Closed_Text.style.display='none'; Codehighlighter1_177_682_Open_Image.style.display='inline'; Codehighlighter1_177_682_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HibernateSqlQuery&nbsp;</span><span id="Codehighlighter1_177_682_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_177_682_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_227_453_Open_Image" onclick="this.style.display='none'; Codehighlighter1_227_453_Open_Text.style.display='none'; Codehighlighter1_227_453_Closed_Image.style.display='inline'; Codehighlighter1_227_453_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_227_453_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_227_453_Closed_Text.style.display='none'; Codehighlighter1_227_453_Open_Image.style.display='inline'; Codehighlighter1_227_453_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;querySql()</span><span id="Codehighlighter1_227_453_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_227_453_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;{usr.*}&nbsp;from&nbsp;T_User&nbsp;usr</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createSQLQuery(sql).addEntity(</span><span style="color: #000000">"</span><span style="color: #000000">usr</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;TUser.</span><span style="color: #0000ff">class</span><span style="color: #000000">).list();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;list.iterator();<br />
<img id="Codehighlighter1_412_450_Open_Image" onclick="this.style.display='none'; Codehighlighter1_412_450_Open_Text.style.display='none'; Codehighlighter1_412_450_Closed_Image.style.display='inline'; Codehighlighter1_412_450_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_412_450_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_412_450_Closed_Text.style.display='none'; Codehighlighter1_412_450_Open_Image.style.display='inline'; Codehighlighter1_412_450_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(it.hasNext())</span><span id="Codehighlighter1_412_450_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_412_450_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(TUser)it.next();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_485_680_Open_Image" onclick="this.style.display='none'; Codehighlighter1_485_680_Open_Text.style.display='none'; Codehighlighter1_485_680_Closed_Image.style.display='inline'; Codehighlighter1_485_680_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_485_680_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_485_680_Closed_Text.style.display='none'; Codehighlighter1_485_680_Open_Image.style.display='inline'; Codehighlighter1_485_680_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;queryMappingSql()</span><span id="Codehighlighter1_485_680_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_485_680_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.getNamedQuery(</span><span style="color: #000000">"</span><span style="color: #000000">queryUser</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setParameter(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Erica</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;query.list().iterator();<br />
<img id="Codehighlighter1_639_677_Open_Image" onclick="this.style.display='none'; Codehighlighter1_639_677_Open_Text.style.display='none'; Codehighlighter1_639_677_Closed_Image.style.display='inline'; Codehighlighter1_639_677_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_639_677_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_639_677_Closed_Text.style.display='none'; Codehighlighter1_639_677_Open_Image.style.display='inline'; Codehighlighter1_639_677_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(it.hasNext())</span><span id="Codehighlighter1_639_677_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_639_677_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(TUser)it.next();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">class&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="com.testproject.hibernate.TUser"</span><span style="color: #ff0000">&nbsp;table</span><span style="color: #0000ff">="T_USER"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">id&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="id"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="id"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">generator&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="native"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">generator</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">id</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">sql-query&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="queryUser"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;![CDATA[</span><span style="color: #808080"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;{usr.*}&nbsp;from&nbsp;T_User&nbsp;usr&nbsp;where&nbsp;name=:name<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">]]&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">return&nbsp;</span><span style="color: #ff0000">alias&nbsp;</span><span style="color: #0000ff">=&nbsp;"usr"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.testproject.hibernate.TUser"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">return</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">sql-query</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;基于存储过程查询&nbsp;sql-query节点的callable属性设定为true,指明当前查询基于存储过程定义</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">sql-query&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="getUsersByAge"</span><span style="color: #ff0000">&nbsp;callable</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">return&nbsp;</span><span style="color: #ff0000">alias</span><span style="color: #0000ff">="user"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.testproject.hibernate.TUser"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">return-property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="id"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="ID"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">return-property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">return-property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="name"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="NAME"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">return-property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">return-property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="age"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="AGE"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">return-property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">return</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{?=call&nbsp;getUsersByAge(?)}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">sql-query</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">hibernate-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
<br />
</p>
<p>&nbsp;&nbsp;&nbsp; 与HQL相同，Native SQL也可以在实体映射文件中进行配置：</p>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/303169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-21 21:37 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/21/303169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(二十一)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302447.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Sun, 15 Nov 2009 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302447.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/302447.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/302447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/302447.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; Criteria提供了符合面向对象编程风格的查询封装模式。不过HQL提供了更加丰富灵活的特性，它在涵盖了Criteria功能范围的前提下，提供了更为强大的查询能力。HQL基于SQL,同时提供了更加面向对象的封装。<br />
&nbsp;&nbsp;&nbsp; 实体查询：HQL子句本身大小写无关，但是其中出现的类名和属性名必须注意大小写区分。需要注意的是，Hibernate中，查询的目标实体存在着继承关系的判定，如"from TUser"将返回所有TUser以及TUser子类的记录，我们知道，Java中所有类的根类都是java.lang.Object,那么，如下HQL将返回数据库中所有库表的记录："from java.lang.Object",在where子句中，我们可以通过比较操作符指定条件，=，&lt;&gt;,&gt;,&gt;,&lt;=,&gt;=,between,notbetween,in,not in,is,like等。与SQL相同，我们可以通过and,or等逻辑连接符组合各个逻辑表达式。</p>
<p>&nbsp;&nbsp;&nbsp; 属性查询：有时我们并不需要获取完整的实体对象，只需要现实部分列，通过HQL也可以做到这点，如："select user.name,user.age form TUser user"表明我们需要读取name和age属性的内容，而此时，返回的list数据结构中，每个条目都是一个对象数组(Object[]),其中一次包含了我们所获取的属性数据。<br />
&nbsp;&nbsp;&nbsp; 如果觉得返回数组的方式不够符合面向对象的风格，我们可以通过在HQL中动态构造对象实例的方法对这些平面化的数据进行封装。"select new TUser(user.name,user.age) from TUser user",我们通过HQL获取数据的部分属性值，与此同时，我们也可以在HQL的select字句中使用统计函数，甚至原生SQL函数，或者利用distinct关键字，剔除返回集中的重复记录。</p>
<p>&nbsp;&nbsp;&nbsp; 实体更新与删除：在Hibernate2中，HQL仅仅用于数据查询，而在Hibernate3中，HQL具备了更加强大的功能。实体更新与删除就是其中的主要特征之一。</p>
<p>&nbsp;&nbsp;&nbsp; 分组和排序：与SQL类似，HQL通过order by子句实现对查询结果的排序，order by子句可以指定多个排序条件："from TUser user order by user.name ,user.age desc"通过Group by子句可进行分组统计。如："select count(user),user.age from TUser user group by user.age",我们知道where子句可以对记录进行甄选。那么，对于Group by子句获得的结果集我们可以通过Having子句进行甄选。例如："select count(user),user.age from TUser user gourp by user.age having count(user)&gt;10".</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 参数绑定：类似JDBC中的SQL操作，我们可以通过顺序占位符"?"对参数进行标识，并在之后对参数内容进行填充。建议使用Query接口"from TUser user where user.name=? and user.age&gt;?",这里除了顺序占位符，我们还可以使用引用占位符，如："from TUser where name=:name"参数绑定机制可以使得查询语法与具体参数数值相互独立。这样，对于参数不同，查询语法相同的查询操作，数据库即可实施性能优化策略。同时，参数绑定机制也杜绝了参数值对查询语法本身的影响。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 引用查询：SQL语句混杂在代码之间将破坏代码的可读性，并使得系统的可维护性降低。为了避免这样的情况出现，我们通常采取将SQL配置化的方式，也就是将SQL保存在配置文件中，需要调用的时候在进行读取。<br />
&lt;query name="queryByName"&gt;<br />
&nbsp;&lt;![CDATA[<br />
&nbsp;&nbsp;from TUser user where user.name=:name<br />
&nbsp;]]&gt;<br />
&lt;/query&gt;<br />
之后，我们可通过session.getNamedQuery方法从配置文件中调用引用的HQL.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 联合查询：inner join,left outer join,right outer join,full join<br />
&nbsp;&nbsp;&nbsp;&nbsp; 子查询：如："from TUser user where (select count(*) from user.addresses)&gt;1"HQL中，子查询必须出现在where子句中，且必须以一对圆括号包围。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 数据加载方式：Hibernate支持以下几种数据加载方式：<br />
1、即时加载：当实体加载完毕后，立即加载其关联数据。<br />
2、延迟加载：实体加载时，其关联数据并非即刻获取，而是当关联数据第一次被访问时再进行读取。<br />
3、预先加载：预先加载时，实体及其关联对象同时读取，这与即时加载类似。<br />
4、批量加载：对于即时加载和延迟加载，可以采用批量加载方式进行性能上的优化。</p>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/302447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-15 22:25 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/15/302447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(二十)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/05/301239.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Thu, 05 Nov 2009 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/05/301239.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/301239.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/05/301239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/301239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/301239.html</trackback:ping><description><![CDATA[Hibernate数据检索：<br />
Criteria Query:通过面向对象化的设计，将数据查询条件封装为一个对象。Criteria本身只是一个查询容器，具体的查询条件需要通过Criteria.add方法添加到Criteria实例中。Expression对象具体描述了查询条件。<br />
示例查询并不常用，一方面它的使用比较繁琐，另外从可读性上来讲也不如Expression来的直观。但是在某些情况下却有其特别的用途。<br />
示例查询最常用的场景是组合查询。我们常常需要在界面上提供若干查询选项，然后根据用户的选择返回复合条件的结果。实例查询在这里能发<br />
挥其特长：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.demo.common.criteriaquery;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Iterator;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Criteria;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Session;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.criterion.DetachedCriteria;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.criterion.Example;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.criterion.Expression;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.criterion.Order;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.criterion.Projections;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;作者&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@version</span><span style="color: #008000;">&nbsp;创建时间：2008-11-29&nbsp;上午09:26:48&nbsp;<br />
&nbsp;*&nbsp;类说明&nbsp;<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TestCriteria&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@authorwyq<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@功能：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">新建一个criteria查询容器</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(TUser.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">(1)cireria查询<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;构造查询条件,Expression对象具体描述了查询条件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在Hibernate3中，引入了Restrictions类作为Expression的替代<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;Expression.eq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等于<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.allEq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参数为一个map包好了多个属性-值对应关系<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大于<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.ge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大于等于<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.lt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小于<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.le&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小于等于<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.between&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表示某个字段位于2个数之间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.like&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模糊查询<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;范围查询<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.eqProperty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用于比较2个属性之间的值"field=field"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.gtProperty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;属性1&gt;属性2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.geProperty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;属性1&gt;=属性2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.ltProperty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;属性1&lt;属性2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.leProperty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;属性1&lt;=属性2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.and&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and关系组合<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or关系组合<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Expression.sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过这个方法直接通过SQL语句限定查询条件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add(Expression.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">Erica</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add(Expression.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">sex</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">1</span><span style="color: #000000;">)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">(2)示例查询<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Example类实现了Criterion接口，同样，它也可以用作Criteria的查询条件。Example<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;的作用是：根据已有对象，查找属性与之相符的其他对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;示例查询最常用的场景是组合查询。我们常常需要在界面上提供若干查询选项，然后<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;根据用户的选择返回符合条件的结果。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Example&nbsp;example&nbsp;=&nbsp;Example.create(cat)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//exclude&nbsp;zero&nbsp;valued&nbsp;properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;excludeProperty("color")&nbsp;&nbsp;//exclude&nbsp;the&nbsp;property&nbsp;named&nbsp;"color"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//perform&nbsp;case&nbsp;insensitive&nbsp;string&nbsp;comparisons<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//use&nbsp;like&nbsp;for&nbsp;string&nbsp;comparisons<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;add(example)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;list();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;exampleUser&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TUser();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exampleUser.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Erica</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add(Example.create(exampleUser));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(3)复合查询<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在原有查询的基础上，针对TUser对象的addresses属性构造了新的查询过滤条件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;addCriteria&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;criteria.createCriteria(</span><span style="color: #000000;">"</span><span style="color: #000000;">addresses</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addCriteria.add(Expression.like(</span><span style="color: #000000;">"</span><span style="color: #000000;">address</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">%Shanghai%</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(4)DetachedCriteria<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使Criteria脱离session实例独立存在，这样，我们就可以将某些通用的Criteria<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;查询条件进行抽离，每次使用时再与当前Session实例绑定以获得更好的代码重用效果<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DetachedCriteria&nbsp;deCriteria&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(TUser.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deCriteria.add(Expression.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Erica</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deCriteria.add(Expression.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">sex</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">1</span><span style="color: #000000;">)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;creiterias&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;deCriteria.getExecutableCriteria(session);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;criteria.list().iterator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(5)高级特性<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;通过criteria.setFirstResult/setMaxResults方法可以限制一次查询返回的记录范围：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;creiterias.setFirstResult(</span><span style="color: #000000;">100</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;creiterias.setMaxResults(</span><span style="color: #000000;">20</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;排序<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;creiterias.addOrder(Order.asc(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;分组与统计<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;分组、统计表达式由Hibernate3新引入的Projections&nbsp;Class进行封装<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;按照age分组查询<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Projections.groupProperty()方法实际上是对SQL&nbsp;group&nbsp;by子句的封装。同<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;样，我们可以通过Projections.avg(),rowCount(),count(),max(),min(),countDistinct()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;等方法实现查询统计功能<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;creiterias.setProjection(Projections.groupProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/301239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-05 11:23 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/05/301239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(十九)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301107.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Wed, 04 Nov 2009 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301107.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/301107.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/301107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/301107.html</trackback:ping><description><![CDATA[由于多对多的性能不佳(由于引入了中间表，一次读取操作需要反复数次查询)，因才在设计中应该避免大量使用。同时，在多对多关系中，应根据情况，采取延迟加载机制来避免无谓的性能开销。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">class&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="com.redsage.hibernate.db.entity.TGroup"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="t_group"</span><span style="color: #ff0000;">&nbsp;dynamic-insert</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;">&nbsp;dynamic-update</span><span style="color: #0000ff;">="false"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">generator&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="native"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">generator</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">set&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="roles"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="t_gourp_role"</span><span style="color: #ff0000;">&nbsp;lazy</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;">&nbsp;inverse</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;">&nbsp;cascade</span><span style="color: #0000ff;">="save-update"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">key&nbsp;</span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="group_id"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">key</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">many-to-many&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.redsage.hibernate.db.entity.TRole"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="role_id"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">many-to-many</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">set</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span></div>
1、t_gourp_role为t_group和t_role之间的映射表，它保存了group和role之间的映射关系。<br />
2、一般情况下，cascade应该设置为"save-update",对于多对多逻辑而言，很少出现删除一方需要级联删除所有关联数据的情况，如删除一个Group,一般不会删除其包含的Role，反之删除Role一般也不会删除其所关联的所有Group.<br />
3、映射表中对于t_group表记录的标示字段。<br />
4、映射表中对于t_role表记录的标示字段。<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">class&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="com.redsage.hibernate.db.entity.TRole"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="t_role"</span><span style="color: #ff0000;">&nbsp;dynamic-insert</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;">&nbsp;dynamic-update</span><span style="color: #0000ff;">="false"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">generator&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="native"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">generator</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">set&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="groups"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="t_gourp_role"</span><span style="color: #ff0000;">&nbsp;lazy</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;">&nbsp;inverse</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;cascade</span><span style="color: #0000ff;">="save-update"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">key&nbsp;</span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="role_id"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">key</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">many-to-many&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.redsage.hibernate.db.entity.TGroup"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="group_id"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">many-to-many</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">set</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span></div>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/301107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-04 17:11 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(十八)-----读深入浅出hibernate有感 </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301086.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Wed, 04 Nov 2009 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301086.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/301086.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/301086.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/301086.html</trackback:ping><description><![CDATA[单向一对多关联：<br />
主控方映射配置如下：<br />
<br />
被动方(TAddress)的记录由Hibernate负责读取，之后存放在主控方(TUser)指定的Collection类型属性中。对于one-to-many<br />
<br />
关联关系，我们可以采用java.util.Set类型的Collection,表现在XML映射文件中就是&lt;set&gt;节点。单向一对多存在一个问题<br />
<br />
，由于是单向关联，为了保持关联关系，我们只能通过主控方对被动方进行级联更新。如果被关联方的关联字段为"NOT <br />
<br />
NULL",当Hibernate创建或者更新关联关系时，可能出现约束违例。<br />
<br />
由于关联方向是单向的，关联关系由TUser对象维持，而被关联的addr对象本身并不知道自己与哪个TUser对象相关联，也就<br />
<br />
是说，addr对象本身并不知道自己的user_id应该设为什么数值。在使用one-to-many进行单向关联时，由于Hibernate实现机<br />
<br />
制中，采用了2条SQL语句进行一次数据插入操作，相对单条insert操作，几乎是2倍的性能开销，效率较低，因此，对于性能<br />
<br />
敏感的系统而言，这样的解决方案所带来的开销可能难以承受。<br />
<br />
如果addr对象知道如何获取user_id字段的内容，那么执行insert语句的时候直接将数据植入即可。这样不但绕开了约束违例<br />
<br />
的可能，而且还节省了一条update语句的开销，大幅度提高了性能。双向一对多关系的出现解决了这个问题。它除了避免约<br />
<br />
束和提高性能的好处之外，还带来另外一个优点，由于建立了双向关联，我们可以在关联双方中任意一方，访问关联的另一<br />
<br />
方，这提供了更丰富灵活的控制手段。<br />
<br />
双向一对多关联，实际上是"一对多"与"多对一"关联的组合。也就是说我们必须在主控方配置单向一对多关系的基础上，在<br />
<br />
被控方配置与其对应的多对一关系。<br />
上代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.demo.common.reference.onetomany;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Set;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;作者&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@version</span><span style="color: #008000;">&nbsp;创建时间：2008-11-28&nbsp;上午10:10:23&nbsp;<br />
&nbsp;*&nbsp;类说明&nbsp;在one-to-many关系中，将many一方设为主控方(inserse=false)将有助于性能的改善。<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TUser&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Set&nbsp;addresses;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Set&nbsp;getAddresses()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;addresses;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setAddresses(Set&nbsp;addresses)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.addresses&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;addresses;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setAge(Integer&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.age&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setId(Integer&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
对应的映射文件：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Mapping&nbsp;file&nbsp;autogenerated&nbsp;by&nbsp;MyEclipse&nbsp;Persistence&nbsp;Tools<br />
</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">class&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="com.wyq.demo.common.reference.onetomany.TUser"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="t_user"</span><span style="color: #ff0000;">&nbsp;dynamic-insert</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;dynamic-update</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;catalog</span><span style="color: #0000ff;">="sample"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">column&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">generator&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="native"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.String"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">column&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="name"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="age"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">column&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="age"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;控制方向反转，Tuser不再作为主控方，而是将关联关系的维护工作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;交给关联对象Taddress来完成，这样Taddress对象在持久化过程中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;，就可以主动获取其关联的TUser对象的id,并将其作为自己的user_id,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;之后执行一次insert操作就可以完成全部工作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">set&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="addresses"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="t_address"</span><span style="color: #ff0000;">&nbsp;inverse</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;cascade</span><span style="color: #0000ff;">="all"</span><span style="color: #ff0000;">&nbsp;order-by</span><span style="color: #0000ff;">="zipcode&nbsp;asc"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">key&nbsp;</span><span style="color: #ff0000;">column</span><span style="color: #0000ff;">="user_id"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">key</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">one-to-many&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.wyq.demo.common.reference.onetomany.TAddress"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">set</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<br />
关联对象：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.demo.common.reference.onetomany;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.Serializable;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;作者&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@version</span><span style="color: #008000;">&nbsp;创建时间：2008-11-28&nbsp;上午10:11:01&nbsp;<br />
&nbsp;*&nbsp;类说明&nbsp;双向一对多关系除了避免约束违例和提高性能的好处之外，还带来了另外一个优点<br />
&nbsp;*&nbsp;由于建立双向关联，我们可以在关联双方中任意一方，访问关联的另一方。<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TAddress&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;zipcode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;tel;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;userId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;TUser&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getAddress()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setAddress(String&nbsp;address)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.address&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setId(Integer&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getTel()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;tel;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setTel(String&nbsp;tel)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.tel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tel;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getType()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setType(String&nbsp;type)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.type&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;TUser&nbsp;getUser()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setUser(TUser&nbsp;user)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getUserId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;userId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setUserId(Integer&nbsp;userId)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.userId&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;userId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getZipcode()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;zipcode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setZipcode(String&nbsp;zipcode)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.zipcode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;zipcode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
关联对象的映射文件：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Mapping&nbsp;file&nbsp;autogenerated&nbsp;by&nbsp;MyEclipse&nbsp;Persistence&nbsp;Tools<br />
</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">class&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="com.wyq.demo.common.reference.onetomany.TAddress"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="t_address"</span><span style="color: #ff0000;">&nbsp;dynamic-insert</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;">&nbsp;dynamic-update</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;">&nbsp;catalog</span><span style="color: #0000ff;">="sample"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">column&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">generator&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="native"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="address"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.String"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="address"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="zipcode"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.String"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="zipcode"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="tel"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.String"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="tel"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="type"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.String"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="type"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">many-to-one&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="user"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="com.wyq.demo.common.reference.onetomany.TUser"</span><span style="color: #ff0000;">&nbsp;cascade</span><span style="color: #0000ff;">="none"</span><span style="color: #ff0000;">&nbsp;outer-join</span><span style="color: #0000ff;">="auto"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="user_id"</span><span style="color: #ff0000;">&nbsp;not-null</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">many-to-one</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
Inverse指的是关联关系的控制方向，而cascade指的是层级之间的连锁操作。在one-to-many关系中，将many一方设为主控方(inverse=false)将有助性能的改善。<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/301086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-04 16:06 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(十七)-----读深入浅出hibernate有感 </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301023.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Wed, 04 Nov 2009 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301023.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/301023.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/301023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/301023.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 对于任何关联操作，首先操作的是主体，然后查看主体的映射文件是否关联其他对象，如果关联，查看关联方式，并进行操作。&nbsp;&nbsp; <br />
&nbsp;name: 属性名。 <br />
<br />
&nbsp;column (可选): 表字段名。<br />
<span id="reply_content_375397220">
<pre> <br />
class : 关联的类的名字。 <br />
<br />
cascade（级联） (可选): 指明哪些操作会从父对象级联到关联的对象。 <br />
<br />
property-ref: (可选) 指定关联类的一个属性，这个属性将会和本外键相对应。 如果没有指定，会使用对方关联类的主键。 <br />
<br />
unique (可选): 使用DDL为外键字段生成一个唯一约束。此外， 这也可以用作property-ref的目标属性。这使关联同时具有 一对一的效果。 <br />
<br />
not-null (可选): 使用DDL为外键字段生成一个非空约束。 <br />
<br />
Hibernate唯一外键关联的一对一关系只是多对以关系的一个特例：<br />
<br />
</pre>
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.demo.common.reference.onetoone.primekey;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.Serializable;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;作者&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@version</span><span style="color: #008000;">&nbsp;创建时间：2008-11-28&nbsp;上午09:39:56&nbsp;<br />
&nbsp;*&nbsp;类说明&nbsp;Hibernate中的唯一外键关联由"many-to-one"节点定义<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用外键来完成一对一，其实就是限制多对一关系中，多的一方只能有一个参考至一的一方，也就是多对一关系<br />
&nbsp;*&nbsp;的一个特例，这可以在映射文件中使用&lt;many-to-one&gt;标签时，加上"unique"属性来设定外键的唯一性。<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TUser&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;TGroup&nbsp;group;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setAge(Integer&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.age&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;TGroup&nbsp;getGroup()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;group;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setGroup(TGroup&nbsp;group)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.group&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;group;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setId(Integer&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span id="reply_content_375397220">
<pre>对应的映射文件：<br />
</pre>
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Mapping&nbsp;file&nbsp;autogenerated&nbsp;by&nbsp;MyEclipse&nbsp;Persistence&nbsp;Tools<br />
</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">class&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="com.wyq.demo.common.reference.onetoone.primekey.TUser"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="t_user"</span><span style="color: #ff0000;">&nbsp;catalog</span><span style="color: #0000ff;">="sample"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">column&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">generator&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="native"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.String"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">column&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="name"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="age"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">column&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="age"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">many-to-one&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="group"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="com.wyq.demo.common.reference.onetoone.primekey.TGroup"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="group_id"</span><span style="color: #ff0000;">&nbsp;unique</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">many-to-one</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<span id="reply_content_375397220">
<pre>一端的关联类：<br />
</pre>
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.demo.common.reference.onetoone.primekey;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.Serializable;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;作者&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@version</span><span style="color: #008000;">&nbsp;创建时间：2008-11-28&nbsp;上午09:40:21&nbsp;<br />
&nbsp;*&nbsp;类说明&nbsp;如果要实现双向的一对一关系，则需要对TGroup进行修改，为其增加一个TUser类<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;完成双向一对一，要在&lt;one-to-one&gt;中，property-ref告诉hibernate,查询出user并将其参考至group<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TGroup&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;TUser&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setId(Integer&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;TUser&nbsp;getUser()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setUser(TUser&nbsp;user)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span id="reply_content_375397220">
<pre>对应的映射文件：<br />
</pre>
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;?</span><span style="color: #000000;">xml&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1.0</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;encoding</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">utf-8</span><span style="color: #000000;">"</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;!</span><span style="color: #000000;">DOCTYPE&nbsp;hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping&nbsp;PUBLIC&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Mapping&nbsp;file&nbsp;autogenerated&nbsp;by&nbsp;MyEclipse&nbsp;Persistence&nbsp;Tools<br />
</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.wyq.demo.common.reference.onetoone.primekey.TGroup</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;table</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">t_group</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;catalog</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">sample</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">id&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">id</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">java.lang.Integer</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">column&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">id</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">generator&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">native</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">id</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">java.lang.String</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">column&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">column</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">one</span><span style="color: #000000;">-</span><span style="color: #000000;">to</span><span style="color: #000000;">-</span><span style="color: #000000;">one&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.wyq.demo.common.reference.onetoone.primekey.TUser</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;property</span><span style="color: #000000;">-</span><span style="color: #000000;">ref</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">group</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">one</span><span style="color: #000000;">-</span><span style="color: #000000;">to</span><span style="color: #000000;">-</span><span style="color: #000000;">one</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<span id="reply_content_375397220">
<pre><br />
</pre>
</span>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/301023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-04 11:05 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Hibernate深入浅出(十六)-----读深入浅出hibernate有感 </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301015.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Wed, 04 Nov 2009 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301015.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/301015.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/301015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/301015.html</trackback:ping><description><![CDATA[数据关联：<br />
&nbsp;&nbsp;&nbsp; 一对一关联包括2种类型：1、主键关联2、唯一外键关联<br />
&nbsp;&nbsp;&nbsp; 一对一的主键关联形式，即2张关联表通过主键形成一对一映射关系。<br />
&nbsp;&nbsp;&nbsp; &lt;one-to-one&gt;节点定义了类与类之间的关系。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.demo.common.reference.onetoone.primekey;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.Serializable;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;作者&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@version</span><span style="color: #008000;">&nbsp;创建时间：2008-11-28&nbsp;上午09:39:56&nbsp;<br />
&nbsp;*&nbsp;类说明&nbsp;Hibernate中的唯一外键关联由"many-to-one"节点定义<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用外键来完成一对一，骑士就是限制多对一关系中，多的一方只能有一个参考至一的一方，也就是多对以关系<br />
&nbsp;*&nbsp;的一个特例，这可以在映射文件中使用&lt;many-to-one&gt;标签时，加上"unique"属性来设定<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TUser&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;TGroup&nbsp;group;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setAge(Integer&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.age&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;TGroup&nbsp;getGroup()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;group;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setGroup(TGroup&nbsp;group)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.group&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;group;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setId(Integer&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
对应的映射文件：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Mapping&nbsp;file&nbsp;autogenerated&nbsp;by&nbsp;MyEclipse&nbsp;Persistence&nbsp;Tools<br />
</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">class&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="com.wyq.demo.common.reference.onetoone.TUser"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="t_user"</span><span style="color: #ff0000;">&nbsp;catalog</span><span style="color: #0000ff;">="sample"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">column&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">generator&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="native"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.String"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">column&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="name"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="age"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">column&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="age"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">one-to-one&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="passport"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="com.wyq.demo.common.reference.onetoone.TPassport"</span><span style="color: #ff0000;">&nbsp;cascade</span><span style="color: #0000ff;">="all"</span><span style="color: #ff0000;">&nbsp;outer-join</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">one-to-one</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<br />
&nbsp;&nbsp;&nbsp; 级联(cscade)在Hibernate映射关系中是个非常重要的概念。它指的是当主控方执行操作时，关联对象(被动方)是否同步执行同一操作。如对主控对象调用save-update或delete方法时，是否同时对关联对象(被动方)进行save-update或delete<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.demo.common.reference.onetoone.foreignkey;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.Serializable;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;作者&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@version</span><span style="color: #008000;">&nbsp;创建时间：2008-11-28&nbsp;上午09:14:10&nbsp;<br />
&nbsp;*&nbsp;类说明&nbsp;由于采用了主键关联方式，那么通过主键关联的2张表，其关联记录的主键值须保持<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同步。这也就是说，我们只须为一张表设定主键生成器，而另一张表的主键与之共享<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;相同的主键值。我们可以通过"foreign"类型的主键生成器与外键共享主键值。<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同时，one-to-one节点的constrained属性必须设定为"true"，以告知hibernate<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当前表主键上存在一个约束。<br />
&nbsp;*&nbsp;在TPassport的id主键上，使用foreign标示与外键共享主键，也就是与User实体共享主键，而<br />
&nbsp;*&nbsp;constrained设定为true,表示约束TPassport的主键必须与user中对应资料的主键相同<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TPassport&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;serial;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;expiry;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;TUser&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getExpiry()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;expiry;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setExpiry(Integer&nbsp;expiry)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.expiry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;expiry;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setId(Integer&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getSerial()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;serial;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setSerial(String&nbsp;serial)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.serial&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;serial;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;TUser&nbsp;getUser()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setUser(TUser&nbsp;user)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
对应的映射文件：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Mapping&nbsp;file&nbsp;autogenerated&nbsp;by&nbsp;MyEclipse&nbsp;Persistence&nbsp;Tools<br />
</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">class&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="com.wyq.demo.common.reference.onetoone.TPassport"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="t_passport"</span><span style="color: #ff0000;">&nbsp;catalog</span><span style="color: #0000ff;">="sample"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="id"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;定义根据user表的主键生成&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">generator&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="foreign"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="property"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">user</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">generator</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;定义约束constrained&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">one-to-one&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="user"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="com.wyq.demo.common.reference.onetoone.TUser"</span><span style="color: #ff0000;">&nbsp;constrained</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">one-to-one</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serial"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.String"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="serial"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="expiry"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="expiry"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<br />
&nbsp;&nbsp;&nbsp; 由于采用了主键关联方式，那么通过主键关联的2张表，其关联记录的主键值须保持同步。这也就意味着，我们只需要为一张表设定主键生成器，而另一张表的主键与之共享相同的主键值。<br />
&nbsp;&nbsp;&nbsp; 在Hibernate中，我们可以通过"foreign"类型的主键生成器与外键共享主键值。同时，one-to-one节点的constrained属性设定为"true",以告知Hibernate当前表主键上存在一个约束："T_Passport"表引用了T_User表的主键。<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/301015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-11-04 10:01 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/11/04/301015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(十五)-----读深入浅出hibernate有感 </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299987.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Tue, 27 Oct 2009 14:32:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299987.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/299987.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/299987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/299987.html</trackback:ping><description><![CDATA[Blob、Clob字段的映射<br />
&nbsp;&nbsp;&nbsp;&nbsp; Blob和Clob字段的区别在于，Blob字段采用单字节存储，适合保存二进制数据，如图片文件。Clob字段采用多字节存储，适合保存大型文本数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在Oracle中Blob/Clob字段独特的访问方式，Oracle Blob/Clob字段本身拥有一个游标，JDBC必须必须通过游标对Blob/Clob字段进行操作，在Blob/Clob字段被创建之前，我们无法获取其游标句柄，这也意味着，我们必须首先创建一个空Blob/Clob字段，再从这个空Blob/Clob字段获取游标，写入我们所期望保存的数据。<br />
<br />
&nbsp;&nbsp;&nbsp; 实体粒度设计:<br />
&nbsp;&nbsp;&nbsp; 在Hibernate世界里，我们经常听到"fine-grained object model"直接翻译就是适当的细粒度对象模型。<br />
&nbsp;&nbsp;&nbsp; 适当的比较模糊，细粒度就是将原本业务模型中的对象加以细分，从而得到更加精细的对象模型。就是划分出更多的对象。分为：面向设计的细粒度划分和面向性能的细粒度划分。<br />
&nbsp;&nbsp;&nbsp; 对于单表的对象细分，在Hibernate中可借助Component节点的定义来完成。何谓Component?从名字上来看，既然称之为组件，则其必然是从属于某个整体的一个组成部分。在Hibernate语义中，我们将某个实体对象中的一个逻辑组成成为Component.Component与实体对象的根本差别，就在于Component没有标示，它作为一个逻辑组成，完全从属于实体对象。通过Component定义，我们将T_User表实际映射到了3个类，TUser,Contact和Name,这样我们就可以在传统关系型库表上，实现了面向对象的领域划分。<br />
&nbsp;&nbsp;&nbsp; 面向性能的细粒度划分：<br />
&nbsp;&nbsp;&nbsp; 当我们通过Hibernate加载TUser对象时，Hibernate会从库表中读取所有的字段数据，并构造TUser实例返回。这里就产生了一个性能方面的问题，作为blob/clob等重量级字段类型，数据库读取操作代价较高。对于需要处理resume和image的应用逻辑而言，这样的代价无法避免，而对于那些无需resume和image信息的操作而言，如此性能无谓的损耗实在可惜。<br />
&nbsp;&nbsp;&nbsp; 如何避免这个问题，Hibernate3提供了属性的延迟加载功能，通过这个功能，我们可以在调用TUser.getResume/getImage时才真正从数据库中读取数据。对于hibernate2来说我们通过继承关系，我们将一个对象进行纵向细分来解决这个问题。我们通过在子类的映射文件中class节点指定polymorphism="explicit"声明了一个显示多态关系。声明为显示多态的类，只有在明确指定类名的时候才会返回此类实例。<br />
<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.hibernateLoad;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.FileInputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.FileNotFoundException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.FileOutputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.IOException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.InputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.OutputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.sql.Blob;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.sql.Clob;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.sql.SQLException;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Hibernate;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.LockMode;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Session;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Transaction;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.wyq.hibernate.TUser2;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TUserOperator&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">复合主键加载数据</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;loadData(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser2&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TUser2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setFirstname(</span><span style="color: #000000;">"</span><span style="color: #000000;">Kevin</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setLastname(</span><span style="color: #000000;">"</span><span style="color: #000000;">Shark</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(TUser2)session.load(TUser2.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;user);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">User&nbsp;age&nbsp;is=&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">user.getAge());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">SQL保存图片</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;saveImage(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser2&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TUser2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setAge(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">20</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;imgis&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInputStream(</span><span style="color: #000000;">"</span><span style="color: #000000;">C:\\inimage.jpg</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Blob&nbsp;img&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Hibernate.createBlob(imgis);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setImage(img);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clob&nbsp;resume&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Hibernate.createClob(</span><span style="color: #000000;">"</span><span style="color: #000000;">This&nbsp;is&nbsp;Clob</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setResume(resume);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.beginTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.save(user);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(FileNotFoundException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">SQL读取图片</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;getImageObj(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser2&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(TUser2)session.load(TUser2.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">3</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clob&nbsp;resume&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;user.getResume();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Blob&nbsp;img&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;user.getImage();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;is&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;img.getBinaryStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;fos&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileOutputStream(</span><span style="color: #000000;">"</span><span style="color: #000000;">c:\\outimage.jpg</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;buf&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[</span><span style="color: #000000;">102400</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;len;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">((len</span><span style="color: #000000;">=</span><span style="color: #000000;">is.read(buf))</span><span style="color: #000000;">!=-</span><span style="color: #000000;">1</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fos.write(buf,</span><span style="color: #000000;">0</span><span style="color: #000000;">,len);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fos.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(FileNotFoundException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Oracle保存图片</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;saveForOracleImage(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TUser2&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TUser2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setAge(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">20</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setImage(Hibernate.createBlob(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[</span><span style="color: #000000;">1</span><span style="color: #000000;">]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setResume(Hibernate.createClob(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">));</span><span style="color: #008000;">//</span><span style="color: #008000;">注意这里的参数是一个空格</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.beginTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.save(user);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">调用flush方法，强制Hibernate立即执行insert&nbsp;sql</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">通过refresh方法，强制Hibernate执行select&nbsp;for&nbsp;update</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.refresh(user,&nbsp;LockMode.UPGRADE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">向Blob写入实际内容</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oracle.sql.BLOB&nbsp;blob&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(oracle.sql.BLOB)user.getImage();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;out&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;blob.getBinaryOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;imgis&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInputStream(</span><span style="color: #000000;">"</span><span style="color: #000000;">c:\\inimage.jpg</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;buf&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[</span><span style="color: #000000;">10240</span><span style="color: #000000;">];</span><span style="color: #008000;">//</span><span style="color: #008000;">10k缓存</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;len;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">((len</span><span style="color: #000000;">=</span><span style="color: #000000;">imgis.read(buf))</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">0</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.write(buf,</span><span style="color: #000000;">0</span><span style="color: #000000;">,len);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgis.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">向CLOB写入实际内容</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oracle.sql.CLOB&nbsp;clob&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(oracle.sql.CLOB)user.getResume();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.Writer&nbsp;writer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;clob.getCharacterOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">this&nbsp;is&nbsp;my&nbsp;resume</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.save(user);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(FileNotFoundException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp; 实体层次设计：继承关系是关系型数据与面向对象数据结构之间的主要差异之一。<br />
&nbsp;&nbsp;&nbsp; Hibernate中支持3种类型的继承形式：<br />
&nbsp;&nbsp;&nbsp; 1、表与子类之间的独立一对一关系。<br />
&nbsp;&nbsp;&nbsp; 2、每个子类对应一张子表，并与主类共享主表<br />
&nbsp;&nbsp;&nbsp; 3、表与类的一对多关系<br />
<br />
<br />
<br />
&nbsp;&nbsp; <br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/299987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-27 22:32 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(十四)-----读深入浅出hibernate有感 </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299985.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Tue, 27 Oct 2009 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299985.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/299985.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/299985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/299985.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 对于新系统的设计开发而言，我们应该尽量避免在哭表中引入与业务逻辑相关的主键关系。<br />
&nbsp;&nbsp;&nbsp; 将业务逻辑主键引入库表，将使得底层库表结构与业务逻辑相耦合，之后业务逻辑的变化，将很可能对底层数据库结构产生连带影响。<br />
&nbsp;&nbsp;&nbsp; 复合主键的引入，很大程度上意味着业务逻辑已经侵入到数据存储逻辑之中。因此在新系统的设计过程中，我们应该尽量避免这样的情况出现。<br />
&nbsp;&nbsp;&nbsp; Hibernate中，通过composite-id节点对复合主键进行定义。<br />
&nbsp;&nbsp;&nbsp; 对于复合主键而言，我们可以通过2种方式确定主键：<br />
&nbsp;&nbsp;&nbsp; 1&gt;基于实体类属性的复合主键<br />
&nbsp;&nbsp;&nbsp; 复合主键由实体类中的属性组成,此时，实体类本身即同事扮演复合主键类的角色。<br />
&nbsp;&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.wyq.hibernate.TUser2</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;table</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">T_User2</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">composite</span><span style="color: #000000;">-</span><span style="color: #000000;">id</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">key</span><span style="color: #000000;">-</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">lastname</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;column</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">lastname</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">string</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">key</span><span style="color: #000000;">-</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">firstname</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;column</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">firstname</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">string</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">composite</span><span style="color: #000000;">-</span><span style="color: #000000;">id</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;column</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">integer</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span></div>
&nbsp;&nbsp;&nbsp; Hibernate要求复合主键类实现equals和hashcode方法，以作为不同数据之间识别的标志。<br />
&nbsp;&nbsp;&nbsp; 主键类的加载：我们可以将TUser2类对象本身作为查询条件进行检索：<br />
&nbsp;&nbsp;&nbsp; 2&gt;基于主键类的复合主键<br />
&nbsp;&nbsp;&nbsp; 我们可以将主键属性独立到一个单独的类中。实现方法类似，只不过映射文件的composite-id节点要引入class和name属性。
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/299985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-27 22:30 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/27/299985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(十三)-----读深入浅出hibernate有感 </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298598.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Fri, 16 Oct 2009 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298598.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/298598.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/298598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/298598.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.hibernate;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.sql.PreparedStatement;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.sql.ResultSet;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.sql.SQLException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.sql.Types;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.ArrayList;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.List;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Hibernate;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.HibernateException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.usertype.UserType;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;EMailList&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;UserType&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;List&nbsp;emails;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;SPLITTER&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">;</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;TYPES&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]{Types.VARCHAR};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isMutable()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;sqlTypes()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;TYPES;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Class&nbsp;returnedClass()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;List.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;创建一个新的List实例，包含原有List实例中的所有元素。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;deepCopy(Object&nbsp;value)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;sourcelist&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(List)value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;targetlist&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetlist.addAll(sourcelist);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;targetlist;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;判断email&nbsp;list是否发生改变<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;equals(Object&nbsp;x,&nbsp;Object&nbsp;y)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(x&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;y)</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(x</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;y</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;xList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(List)x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;yList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(List)y;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(xList.size()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;yList.size())</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">xList.size();i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(String)xList.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(String)yList.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">str1.equals(str2))</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;从resultSet中取出email字段，并将其解析为List类型后返回<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;nullSafeGet(ResultSet&nbsp;rs,&nbsp;String[]&nbsp;names,&nbsp;Object&nbsp;owner)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException,&nbsp;SQLException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(String)Hibernate.STRING.nullSafeGet(rs,names[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(value</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;parse(value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;将List型的email信息组成字符串后保存到email字段<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;nullSafeSet(PreparedStatement&nbsp;st,&nbsp;Object&nbsp;value,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException,&nbsp;SQLException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Set&nbsp;method&nbsp;executed</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(value</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">assemble((List)value);</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate.STRING.nullSafeSet(st,&nbsp;str,&nbsp;index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate.STRING.nullSafeSet(st,&nbsp;value,&nbsp;index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;将String拼装为一个字符串，以";"分隔<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;assemble(List&nbsp;emailList){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;strBuf&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">emailList.size()</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strBuf.append(emailList.get(i)).append(SPLITTER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strBuf.append(emailList.get(emailList.size()</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;strBuf.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;将以";"分隔的字符串解析为一个字符串数组<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;List&nbsp;parse(String&nbsp;value){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;strs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;org.apache.commons.lang.StringUtils.split(value,String.valueOf(SPLITTER));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;emailList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">strs.length;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emailList.add(strs[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;emailList;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;assemble(Serializable&nbsp;arg0,&nbsp;Object&nbsp;arg1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Serializable&nbsp;disassemble(Object&nbsp;arg0)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;hashCode(Object&nbsp;arg0)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;replace(Object&nbsp;arg0,&nbsp;Object&nbsp;arg1,&nbsp;Object&nbsp;arg2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
}<br />
<br />
</span></div>
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/298598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-16 16:57 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(十二)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298592.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Fri, 16 Oct 2009 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298592.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/298592.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/298592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/298592.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 我们的目标是为数据逻辑层及业务逻辑层提供更加易于操作的对象，根据这里的情况，将email字段映射为一个List集合<br />
<br />
类型是个不错的选择，如何将一个字段映射为List类型，Hibernate并没有提供原生支持，我们必须实现自己的UserType.<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.wyq.hibernate;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;UserType&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;返回UserType所映射字段的SQL类型(java.sql.Types)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;返回类型为int[],其中包含了映射各字段的SQL类型代码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(UserType可以映射到一个或者多个字段)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@see</span><span style="color: #008000;">&nbsp;java.sql.Types<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;int[]&nbsp;the&nbsp;typecodes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;sqlTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;UserType.nullSafeGet()所返回的自定义数据类型<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;Class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Class&nbsp;returnedClass();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;自定义数据类型的对比方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;此方法将用作脏数据检查，参数x,y分别为数据的2个副本<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;如果equals方法返回false,则Hibernate将认为数据发生变化，并将变化更新到库表中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;equals(Object&nbsp;x,Object&nbsp;y)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HiberanteException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;从JDBC&nbsp;ResultSet读出数据，将其转换为自定义类型后返回<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(此方法要求对可能出现的null值进行处理)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;names中包含了当前自定义类型的映射字段名称。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;nullSafeGet(ResultSet&nbsp;rs,String[]&nbsp;names,Object&nbsp;owner)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException,SQLException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;本方法将在Hibernate进行数据保存时被调用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;我们可以通过PreparedStatement将自定义数据写入对应的库表字段<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;nullSafeSet(PreparedStatement&nbsp;st,Object&nbsp;value,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException,SQLException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;提供自定义类型的完全复制方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;本方法将用作构造返回对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;当nullSafeGet方法调用之后，我们获得了自定义数据对象，在向用户返回自定义数据之前，deepCopy方法将被调用，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;它将根据自定义数据对象构造一个完全拷贝，并将此拷贝返回给用户使用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;此时，我们就得到了自定义数据对象的2个版本，第一个是从数据库读出的原始版本，其二是我们通过deepCopy构造的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;复制版本，原始版本将由Hibernate负责维护，复制版本将由用户使用，原始版本用作稍后的脏数据检查一句;Hibernate<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;将在脏数据检查过程中将这2个版本的数据进行比对，如果数据发生了变化，则执行对应的持久化操作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;数据发生了变化，则执行对应的持久化操作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;deepCopy(Object&nbsp;value)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;HibernateException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;本类型实例是否可变<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isMutable();<br />
}</span></div>
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/298592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-16 15:59 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(十一)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298572.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Fri, 16 Oct 2009 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298572.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/298572.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/298572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/298572.html</trackback:ping><description><![CDATA[class属性有一下几种类型：<br />
1、Assiged:主键由应用逻辑产生，数据交由Hibernate保存时，主键值已经设置完毕，无需Hibernate干预。<br />
2、hilo:通过hi/lo算法实现的主键生成机制，需要额外的数据库表保存主键生成历史状态。<br />
3、与hilo类似，通过hi/lo算法实现的主键生成机制，只是主键历史状态保存在Sequence中，适用于支持Sequence的数据库。<br />
4、incremaent：主键按数值顺序递增。此方式的实现机制为在当前应用中维持一个变量，以保存着当前的最大值，之后每次需要生成主键的时候将此值加1作为主键。如果同一数据库有多个实例访问，此方式必须避免使用。<br />
5、identity:采用数据库提供的主键生成机制.<br />
6、sequence:采用数据库提供的sequence机制生成主键<br />
7、native:由Hibernate根据数据库适配器中的定义，自动采用identity、hilo、sequence的其中一种作为主键生成方式。<br />
8、uuid.hex:这种主键生成机制在最大程度上保证了产生ID的唯一性。<br />
9、uuid.string:与uuid.hex类似。<br />
10、foreign:使用外部表的字段作为主键。<br />
<br />
&nbsp;&nbsp;&nbsp; 由于常用的数据库，如SQLServer、MySql等，都提供了易用的主键生成机制。我们可以在数据库提供的主键生成机制上，采用generator-class=native的主键生成方式。<br />
&nbsp;&nbsp;&nbsp; 不过，值得注意的是，一些数据库提供的主键生成机制在效率上未必最佳，大量并发insert数据时可能会引起表之间的互锁。<br />
&nbsp;&nbsp;&nbsp; 数据库提供的主键生成机制，往往是通过在一个内部表中保存当前主键状态，之后每次插入数据会读取这个最大值，然后加上递增量作为新记录的主键值，之后再把这个新的最大值更新回内部表中，这样，一次Insert操作可能导致数据库内部多次表读写操作，同时伴随的还有数据的加锁解锁操作，这对性能产生了很大影响。<br />
&nbsp;&nbsp;&nbsp; 另外，对于借用Sequence作为主键产生机制的数据库而言，如Oracle,如果采用&lt;generator class="sequence"&gt;设定，那么插入一条新的数据之前，Hibernate必须首先向数据库发起一条select sequence操作以获取主键值。<br />
&nbsp;&nbsp;&nbsp; 这样，一次保存操作实际上包含了2个过程，首先查询sequence获得主键，其次执行Insert插入记录，无疑操作效率相对较低。<br />
&nbsp;&nbsp;&nbsp; 大多数情况下，如果逻辑允许，可以考虑使用uuid.hex主键生成方式。<br />
<br />
&nbsp;&nbsp;&nbsp; Hibernate3同时还提供了另一种与实体类型无关的映射方式：动态模型(Dynamic Model),所谓动态模型，即通过通用数据容器(Map)对库表记录进行表达。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;?</span><span style="color: #000000;">xml&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1.0</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;encoding</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;!</span><span style="color: #000000;">DOCTYPE&nbsp;hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping&nbsp;PUBLIC<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;entity</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">DynamicUserMap</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;table</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">T_User</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">id&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">id</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;column</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">id</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">java.lang.Integer</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">generator&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">native</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">id</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">java.lang.String</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;column</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">java.lang.Integer</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;column</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span></div>
<br />
操作示例：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sessionFactory.openSession().getSession(EntityMode.MAP);<br />
Map&nbsp;userMap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashMap();<br />
userMap.put(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">ken</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
userMap.put(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">25</span><span style="color: #000000;">));<br />
<br />
Transaction&nbsp;tx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.beginTransaction();<br />
session.save(</span><span style="color: #000000;">"</span><span style="color: #000000;">DynamicUserMap</span><span style="color: #000000;">"</span><span style="color: #000000;">,userMap);<br />
tx.commit();</span></div>
<br />
首先，我们以EntityMode.MAP模式获取Session实例，以此表明Session操作的对象并非普通的实体类，而是Map类型数据。<br />
其次，在执行实体操作时，须指明要操作的实体名：<br />
session.save("DynamicUserMap",userMap);<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/298572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-16 14:22 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/16/298572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(十)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/15/298391.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Thu, 15 Oct 2009 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/15/298391.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/298391.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/15/298391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/298391.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/298391.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 为了使用Hibernate的Transaction API,我们必须通过hibernate.transaction.factory_class属性指定一个Transaction实例工厂类。Transaction API隐藏了底层的事务机制，允许Hibernate代码在受管制和非受管制的环境下都可以进行。<br />
<br />
使用JDBC的事务处理机制：<br />
hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory<br />
使用JTA<br />
hiberante.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory<br />
jta.UserTransaction jta/usertransaction<br />
&nbsp;&nbsp;&nbsp; O/R映射关系无疑是ORM框架中最为关键的组成部分，在进行Hibernate实体属性映射关系定义时，需要提供属性的数据类型设定，通过这些类型定义，Hibernate即可完成Java数据类型到数据库特定数据类型的映射关系。<br />
&nbsp;&nbsp;&nbsp; 实体映射技术作为类与表之间的联系纽带，在ORM实现中起着至关重要的作用。<br />
&nbsp;&nbsp;&nbsp; 实体映射的核心内容，即实体类与数据库表之间的映射定义。Hibernate中，类表映射主要包括3个部分内容：<br />
&nbsp;&nbsp;&nbsp; a、表名-类名映射<br />
&nbsp;&nbsp;&nbsp; b、主键映射<br />
&nbsp;&nbsp;&nbsp; c、字段映射<br />
&nbsp;&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">class&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="com.redsage.hibernate.db.entity.TUser"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="T_USER"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">generator&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="native"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.String"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="age"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="age"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.Integer"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span></div>
&nbsp;&nbsp;&nbsp; XML文件头定义了本XML文档所采用的编码方式：encoding="UTF-8".并指定了当前XML的DTD,DTD文件对当前XML文档中的节点进行定义，这样我们加载配置文件之前，可通过指定的DTD对当前XML中的节点进行检查，确定XML结构和数据类型是否合法。<br />
&nbsp;&nbsp;&nbsp; 通过CLASS节点的配置，hibernate即可获知类与表的映射关系，即每个TUser类对象对应T_User表中的一条记录。<br />
&nbsp;&nbsp;&nbsp; ID节点定义类实体类的标示(identity),在这里也就是对应库表主键的类属性，name="id"指定了当前映射类中的属性"id"对应了T_User表中的主键字段。<br />
&nbsp;&nbsp;&nbsp; column="id"指定了当前映射表T_User唯一标示为"id"字段.id字段是T_User表的一个自增型字段，同时也是T_User表的主键。通过id字段我们即可唯一定位一条记录。<br />
&nbsp;&nbsp;&nbsp; type="java.lang.Integer"指定了当前字段的数据类型。<br />
&nbsp;&nbsp;&nbsp; &lt;generator class="native"/&gt;指定了主键生成方式，这里的class="native"设定，意味着将主键生成机制的实现方式交由hibernate决定，hibernate将根据底层数据库适配器的定义，采用不同数据库特定的主键生成方式。<br />
&nbsp;&nbsp;&nbsp; <br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/298391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-15 14:58 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/15/298391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(九)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/11/297758.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Sun, 11 Oct 2009 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/11/297758.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/297758.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/11/297758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/297758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/297758.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; Hibernate基础配置选项主要围绕SessionFactory展开：<br />
&nbsp;&nbsp; 在hibernate.cfg.xml配置文件中，我们可以通过mapping节点配置需要加载的Hibernate映射文件，如果选用了propertie<br />
<br />
形式的配置文件(hibernate.properties),由于缺乏相应的配置条目，这时候就需要通过编码进行加载：<br />
Configuration cfg = new Configuration().addFile("TUser.hbm.xml").addClass(com.redsage.db.entity.TGroup.class)<br />
1、添加位于CLASSPATH根目录下的TUser.hbm.xml映射文件<br />
2、以class形式加载映射实体类com.readsage.db.entity.TGroup<br />
<br />
&nbsp;&nbsp; 在Hibernate中，可以设置2种数据库访问策略：一种是根据指定的JDBC参数进行数据库连接，由Hibernate来完成连接管<br />
<br />
理过程：另外一种则是通过JNDI完成数据库连接获取。<br />
1、数据库适配器<br />
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect<br />
2、数据库JDBC驱动类<br />
hibernate.connection.driver_class com.mysql.jdbc.Driver<br />
JNDI配置：<br />
hibernate.connection.datasource jdbc/test<br />
3、数据库URL<br />
hibernate.connection.url jdbc:mysql://localhost/sample<br />
4、数据库用户名<br />
hibernate.connection.username root<br />
5、数据库密码<br />
hiberante.connection.password<br />
<br />
&nbsp;&nbsp;&nbsp; 当我们使用JDBC方式访问数据库时，可以为其指定数据库连接池实现，目前Hibernate支持4种连接池实现组件：<br />
C3P0:<br />
hibernate.c3p0.max_size 2<br />
hibernate.c3p0.min_size 2<br />
//获得连接的超时时间,如果超过这个时间,会抛出异常，单位毫秒<br />
hibernate.c3p0.timeout 5000<br />
//最大的PreparedStatement的数量<br />
hibernate.c3p0.max_statements 100<br />
//每隔3000秒检查连接池里的空闲连接 ，单位是秒<br />
hibernate.c3p0.idle_test_period 3000<br />
//当连接池里面的连接用完的时候，C3P0一下获取的新的连接数<br />
hibernate.c3p0.acquire_increment 2<br />
//每次都验证连接是否可用<br />
hibernate.c3p0.validate false<br />
hibernate.connection.provider_class net.sf.hibernate.connection.C3p0ConnectionProvider<br />
<br />
解释：<br />
hibernate.c3p0.timeout，这个表示连接池中的连接对象在多长时间没有使用过后，就应该被销毁<br />
hibernate.c3p0.idle_test_period ，这个表示连接池检测线程多长时间检测一次池内的所有链接对象是否超时<br />
注意：连接对象自己不会把自己从连接池中移除，而是专门有一个线程按照一定的时间间隔<br />
<br />
(hibernate.c3p0.idle_test_period )来做这件事，这个线程通过比较连接对象最后一次被使用时间和当前时间的时间差来<br />
<br />
和hibernate.c3p0.timeout做对比，进而决定是否销毁这个连接对象。<br />
<br />
DBCP:<br />
//连接池的最大活动个数 <br />
hibernate.dbcp.maxActive 100<br />
//当连接池中的连接已经被耗尽的时候，DBCP将怎样处理( 0 = 失败, 1 = 等待, 2= 增长) <br />
hibernate.dbcp.whenExhaustedAction 1<br />
//最大等待时间 <br />
hibernate.dbcp.maxWait 120000<br />
//没有人用连接的时候，最大闲置的连接个数。<br />
hibernate.dbcp.maxIdle 10<br />
hibernate.dbcp.ps.maxActive 100<br />
hibernate.dbcp.ps.whenExhaustendAction 1<br />
hibernate.dbcp.ps.maxWait 120000<br />
hibernate.dbcp.ps.maxIdle 10<br />
<br />
//给出一条简单的sql语句进行验证 <br />
hibernate.dbcp.validationQuery select 1 from dual<br />
//在取出连接时进行有效验证 <br />
hibernate.dbcp.testOnBorrow true<br />
//在放回连接时进行有效验证 <br />
hibernate.dbcp.testOnreturn false<br />
//Hibernate已经实现了DBCP Provider实现，别忘了在下面的键值去掉＃字符 <br />
hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/297758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-11 11:11 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/11/297758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(八)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/11/297752.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Sun, 11 Oct 2009 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/11/297752.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/297752.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/11/297752.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/297752.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/297752.html</trackback:ping><description><![CDATA[&nbsp; 在Hibernate中，session负责完成对象的持久化操作，而Hibernate Session与之Hibernate,相当于JDBCConnection与之JDBC<br />
1、初始化Hibernate配置管理类Configuration<br />
Configuration config = new Configuration().configure();<br />
利用CLASSPATH中的默认配置文件hibernate.cfg.xml构建Configuration实例。<br />
2、通过Configuration类实例创建Session的工厂类SessionFactory<br />
SessionFactory sessionFactory = config.buildSessionFactory();<br />
3、通过SessionFactory得到Session实例<br />
session = sessionFactory.openSession();<br />
通过这个Session实例，就可以对对象进行持久化操作<br />
<br />
&nbsp; Configuration类负责管理Hibernate的配置信息，Hibernate运行时需要获取一些底层实现的基本信息，包括：<br />
数据库URL<br />
数据库用户名<br />
数据库用户密码<br />
数据库JDBC驱动类<br />
数据库适配器，用于对特定数据库提供支持。<br />
<br />
&nbsp; Configuration类一般只有在获取SessionFactory时需要涉及，当SessionFactory实例创建之后，由于配置信息已经由hibernate绑定在返回的SessionFactory之中，因此一般情况下无需在对其操作。<br />
如果不希望使用默认的hibernate.cfg.xml文件作为配置文件，还有如下方法：<br />
File file = new File("c:\\sample\\myhiernate.xml");<br />
Configuration config = new Configuration().configure(file);<br />
<br />
&nbsp; SessionFactory负责创建Session实例：<br />
Configuration config = new Configuration().configure();<br />
SessionFactory sessionFactory = config.buildSessionFactory();<br />
SessionFactory一旦构造完成，即被赋予特定的配置信息。如果需要使用基于改动后的config实例的SessionFactory,需要从config重新构建一个SessionFactory实例。<br />
SessionFactory中保存了对应当前数据库配置的所有映射关系，同时也负责维护当前的二级缓存和Statement Pool.由此可见，SessionFactory的创建过程必然非常复杂，代价高昂，而这也就意味着，我们应该在系统设计中充分考虑到SessionFactory的重用策略。由于SessionFactory是线程安全的，可以多个线程并发调用，大多数情况下，一个应用中针对一个数据库共享一个SessionFactory实例即可。<br />
<br />
&nbsp; Session作为贯穿Hibernate的持久化管理器核心，提供了众多持久化方法，如save、update、delete,find等。通过这些方法，可透明的完成对象的增删改查。同事，Hibernate Session的设计是非线程安全的，也就是说，一个Session实例同时只可一个线程使用，同一个Session实例的多线程并发调用将导致难以预知的错误<br />
Configuration config = new Configuration().configure();<br />
SessionFactory sessionFactory = config.buildSessionFactory();<br />
Session session = sessionFactory.openSession();<br />
<br />
Save操作：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">新增名为"Emma"的用户记录</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">TUser&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TUser();<br />
user.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Emma</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
session.save(user);</span></div>
<br />
Get操作：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">假设T_User表中存在id=1的记录</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">TUser&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(TUser)session.get(TUser.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">1</span><span style="color: #000000;">));</span></div>
<br />
delete操作：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">假设T_User表中存在id=1的记录</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">TUser&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(TUser)session.get(TUser.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">1</span><span style="color: #000000;">));<br />
session.delete(user);</span></div>
<br />
<br />
//也可以通过HQL指定删除条件(Hibernate2)<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">session.delete(</span><span style="color: #000000;">"</span><span style="color: #000000;">from&nbsp;TUser&nbsp;where&nbsp;id=1</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br />
<br />
//通过Query接口进行基于HQL的删除操作(Hibernate3)<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">String&nbsp;hql&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">delete&nbsp;TUser&nbsp;where&nbsp;id=1</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
Query&nbsp;query&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createQuery(hql);<br />
query.executeUpdate();<br />
Find(Hibernate2)操作<br />
String&nbsp;hql&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">form&nbsp;TUser&nbsp;where&nbsp;name='Erica'</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
List&nbsp;userList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.find(hql);</span></div>
<br />
<br />
Hibernate3中的Session接口取消了find方法，我们必须通过Query或Criteria接口进行数据查询<br />
通过Query接口进行数据查询：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">String&nbsp;hql&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">from&nbsp;TUser&nbsp;user&nbsp;where&nbsp;user.name&nbsp;like&nbsp;?</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
Query&nbsp;query&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createQuery(hql);<br />
query.setParameter(</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">Cartier</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
List&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;query.list();<br />
<br />
Iterator&nbsp;it&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;list.iterator();<br />
</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(it.hasNext()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(TUser)it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(user.getName);<br />
}<br />
</span></div>
<br />
通过Criteria接口进行数据查询：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Criteria&nbsp;criteria&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(TUser.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
criteria.add(Expression.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">Cartier</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<br />
List&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;criteria.list();<br />
Iterator&nbsp;it&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;list.iterator();<br />
</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(it.hasNext()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;TUser&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(TUser)it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(user.getName());<br />
}</span></div>
<br />
Query面向HQL和Native SQL，而Criteria则提供了面向对象的查询模式。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/297752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-11 10:33 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/11/297752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(七)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/09/297546.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Fri, 09 Oct 2009 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/09/297546.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/297546.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/09/297546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/297546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/297546.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Hibernate对JDBC进行了妥善封装，会自动根据对象和表之间的映射关系，将对象操作转换为SQL加以执行。<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HibernateTest&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;TestCase{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;JUnit中setUp方法在TestCase初始化的时候会自动调用一般用于初始化公用资源<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setUp(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*采用hibernate.properties或者hibernate.cfg.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*配置文件的初始化代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*Configuration&nbsp;config&nbsp;=&nbsp;new&nbsp;Configuration();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*config.addClass(Tuser.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">采用hiberante.cfg.xml配置文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">1、configuration的初始化方式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">2、xml文件中已经定义了Mapping文件，因此无需在编码导入</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Configuration&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Configuration().configure();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionFactory&nbsp;sessionFactory&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config.buildSessionFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sessionFactory.openSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(HibernateException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*与setUp方法相对应，JUnitTestCase执行完毕时，会自动调用tearDown方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*一般用于资源释放<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;tearDown(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(HibernateException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*对象持久化<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;testInsert(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tran&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tran&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.beginTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tuser&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Tuser();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Emma</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.save(user);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tran.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(HiberanteException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrance();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/297546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-09 15:07 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/09/297546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(六)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/09/297537.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Fri, 09 Oct 2009 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/09/297537.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/297537.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/09/297537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/297537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/297537.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Hibernate基础代码包括POJO类和Hibernate映射文件。<br />
&nbsp;&nbsp;&nbsp; POJO在Hibernate语义中理解为数据库表所对应的Domain Object.字面上来讲就是无格式普通Java对象，可以简单的理解为一个不包含逻辑代码的值对象(Value Object简称VO),从数据层面上看，POJO作为数据实体的对象化表现形式，也成为实体类。<br />
&nbsp;&nbsp;&nbsp; Hibernate是一种对象-关系型数据映射组件，它使用映射文件将对象与关系型数据相关联。在Hibernate中，映射文件通常以.hbm.xml作为后缀。<br />
<br />
&nbsp;&nbsp;&nbsp; 配置文件名默认为hibernate.cfg.xml,Hibernate初始化期间会自动在CLASSPATH中寻找这个文件，并读取其中的配置信息，为后期数据库操作做好准备。<br />
<br />
&nbsp;&nbsp;&nbsp; 一个典型的hibernate.cfg.xml配置文件如下：<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;?</span><span style="color: #000000;">xml&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1.0</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;encoding</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">utf-8</span><span style="color: #000000;">"</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!</span><span style="color: #000000;">DOCTYPE&nbsp;hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">configuration&nbsp;PUBLIC&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">-//Hibernate/Hibernate&nbsp;Configuration&nbsp;DTD//EN</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">configuration</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">session</span><span style="color: #000000;">-</span><span style="color: #000000;">factory</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">数据库URL</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hibernate.connection.url</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc:mysql:</span><span style="color: #008000;">//</span><span style="color: #008000;">localhost/sample</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">数据库JDBC驱动</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hibernate.connection.driver_class</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.git.mm.mysql.Driver<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">数据库用户名</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hibernate.connection.username</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">数据库密码</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hibernate.connection.password</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mypass<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">dialect,每个数据库都有其对应的Dialect以匹配其平台特性</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hibernate.dialect.MySQLDialect</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;net.sf.hibernate.dialect.MySQLDialect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">是否将运行期生成的SQL输出到日志以供调试</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hibernate.show_sql</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;True<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">是否使用数据库外连接</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hibernate.use_outer_join</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;True<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">事务管理类型，这里我们使用JDBC&nbsp;Transaction</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hibernate.transaction.factory_class</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;net.sf.hibernate.transaction.JDBCTransactionFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">映射文件配置，注意配置文件名必须包含其相对于根的全路径</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">mapping&nbsp;resource</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com/redsage/quickstart/Tuser.hbm.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">session</span><span style="color: #000000;">-</span><span style="color: #000000;">factory</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">configuration</span><span style="color: #000000;">&gt;</span></div>
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Hibernate3中对包名进行了修改(net.sf.hibernate=&gt;org.hibernate)如果采用hibernate3除了包名修改外，DTD文件也要做对应修改http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd<br />
&nbsp;&nbsp;&nbsp; 在hibernate项目的SRC目录下，创建内容同上的hibernate.cfg.xml文件。<br />
<br />
&nbsp;&nbsp;&nbsp; Hibernate采用Apache common logging,并结合Apache log4j作为日志输出组件。<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/297537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-09 14:36 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/09/297537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(五)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/08/297437.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Thu, 08 Oct 2009 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/08/297437.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/297437.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/08/297437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/297437.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/297437.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 现在众多应用服务器以及开源社区中，都提供了完备的数据库连接池组件，选择采用这些成熟稳定的组件作为我们产品开发的基石，在绝大多数情况下是比选择自己实现更聪明的决策，还是那句老话：不要重复发明轮子。<br />
&nbsp;&nbsp;&nbsp; 2个数据库连接池组件：<br />
&nbsp;&nbsp;&nbsp; Apache Jakarta Commons DBCP<br />
&nbsp;&nbsp;&nbsp; Proxool<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; JDBC程序设计中，除了数据库连接，还有另外一个往往被忽视的重要资源---Statement,通过使用PreparedStatement,在绝大多数情况下可以有效提高重复性数据库调用的性能。<br />
&nbsp;&nbsp;&nbsp; 借助Connection实例创建PreparedStatement对象相当简单，不过简单的表面下却隐藏着复杂的实现，当PreparedStatement对象创建时，数据库会对这个PreparedStatement中的SQL进行语法检查、语义分析、选择优化器并创建相应的执行计划。<br />
<br />
&nbsp;&nbsp;&nbsp; 目前，无论是商业领域还是开源社区，都已经为我们提供了丰富且久经考验的持久层组件，使用这些成熟可靠的已有实现可以在很大程度上规避技术上的风险，同时迅速提高应用系统开发的劳动产出比。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 第一章终于看完了，好累，每看一次，每次的感觉都不一样。方兴未艾。<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/297437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-08 11:25 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/08/297437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(四)-----读深入浅出hibernate有感 </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/08/297428.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Thu, 08 Oct 2009 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/08/297428.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/297428.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/08/297428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/297428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/297428.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Decorator模式：简单来讲，就是通过一个Decorator对原有对象进行封装，同事实现与原有对象相同的接口，从而得到一个基于原有对象的，对既有接口的增强型实现。<br />
&nbsp;&nbsp;&nbsp; 首先引入一个ConnectionDecorator类：<br />
&nbsp;&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ConnectionDecorator&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Connection{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;dbconn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ConnectionDecorator(Connnection&nbsp;conn){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.dbconn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;conn;</span><span style="color: #008000;">//</span><span style="color: #008000;">实际从数据库获得的Connection引用</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;close()</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;SQLException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.dbconn.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;commit()</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;SQLException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.dbconn.commit();</span><span style="color: #008000;">//</span><span style="color: #008000;">调用实际连接的commit方法</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
&nbsp;&nbsp;&nbsp; ConnectionDecorator类实际上是对传入的数据库连接加上了一个外壳，它实现了java.sql.Connection接口，不过本身并没有实现任何实际内容，只是简单的把方法的实现委托给运行期实际获得的Connection实例，而从外部看，ConnectionDecorator与普通的Connection实例没有什么区别。<br />
&nbsp;&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PooledConnection&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;ConnectionDecorator&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Connection{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;ConnectionPool&nbsp;connPool;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;PooledConnection(ConnectionPool&nbsp;pool,Connection&nbsp;conn){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(conn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connPool&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pool;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">覆盖close方法，将数据库连接返回连接池中，而不是直接关闭连接</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;close()</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;SQLException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connPool.releaseConnection(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.dbconn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
动态代理：<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ConnectionHandler&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;InvocationHandler{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;dbconn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectionPool&nbsp;pool;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ConnectionHandler(ConnectionPool&nbsp;connPool){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pool&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;connPool;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">将动态代理绑定到指定Connection</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Connection&nbsp;bind(Connection&nbsp;conn){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.dbconn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;conn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;proxyConn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),conn.getClass().getInterfaces(),</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;proxyConn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">方法调用拦截器</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,Method&nbsp;method,Object[]&nbsp;args)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">close</span><span style="color: #000000;">"</span><span style="color: #000000;">.equals(method.getName())){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.releaseConnection(dbconn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;method.invoke(dbconn,args);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;obj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;ConnectionHandler&nbsp;connHandler&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ConnectionHandler(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;connHandler.bind(conn);</span></div>
可以看到，基于Dynamic Proxy模式的实现相对Decorator更加简洁明了。<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/297428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-08 10:02 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/08/297428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(三)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/07/297363.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Wed, 07 Oct 2009 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/07/297363.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/297363.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/07/297363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/297363.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/297363.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 无论是怎样的应用系统，都无法脱离对资源的管理和使用。而对于持久层而言，资源的合理管理和调度则显得尤为重要。<br />
&nbsp;&nbsp;&nbsp; 资源管理机制的设计对于系统整体表现往往可以产生关键性影响。同时，除去性能之外，良好的资源管理机制还能为系统的伸缩性、可维护性带来相当的提升。<br />
&nbsp;&nbsp;&nbsp; Connection Pool:数据库连接池技术带来的优势<br />
&nbsp;&nbsp;&nbsp; 1、资源重用<br />
&nbsp;&nbsp;&nbsp; 由于数据库连接得以重用，避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上，另一方面也增进了系统运行环境的平稳性。<br />
&nbsp;&nbsp;&nbsp; 2、更快的系统响应速度<br />
&nbsp;&nbsp;&nbsp; 数据库连接池在初始化过程中，往往已经创建了若干数据库连接池置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言，直接利用现有可用连接，避免了数据库连接初始化和释放过程的时间开销，从而缩减了系统整体响应时间。<br />
&nbsp;&nbsp;&nbsp; 3、新的资源分配手段<br />
&nbsp;&nbsp;&nbsp; 对于多应用共享同一数据库的系统而言，可在应用层通过数据库连接池的配置，实现某一应用最大可用数据库连接数的限制，避免某一应用独占所有数据库资源<br />
&nbsp;&nbsp;&nbsp; 4、统一的连接管理，避免数据库连接泄露<br />
&nbsp;&nbsp;&nbsp; 在较为完备的数据库连接池实现中，可根据预先的连接占用超时设定，强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄露。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DBConnectionPool&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;ConnectionPool{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;statci&nbsp;Vector&nbsp;pool;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;POOL_MAX_SIZE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取数据库连接，如果当前池中有可用连接，则将池中最后一个返回，如果没有，则新建一个返回</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">&nbsp;Connection&nbsp;getConnection()</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;DBException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pool</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Vector();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pool.isEmpty()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;createConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;last_idx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pool.size()</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Connection)pool.get(last_idx);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.remove(pool.get(last_idx));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;conn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">将使用完毕的数据库连接放回备用池中</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;releaseConnection(Connection&nbsp;conn){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pool.size()</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">POOL_MAX_SIZE){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(SQLException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.add(conn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">读取数据库配置信息，从数据库连接池中获得数据库连接</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Connection&nbsp;createConnection()</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;DBException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">oracle.jdbc.driver.OracleDriver</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DriverManager.getConnection(</span><span style="color: #000000;">"</span><span style="color: #000000;">jdbc:oracle:thin:@localhost:1521:oracle</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">personal</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">personal</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;conn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}cacth(ClassNotFoundException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DBException(</span><span style="color: #000000;">"</span><span style="color: #000000;">ClassNotFoundException&nbsp;when&nbsp;loading&nbsp;JDBC&nbsp;Driver</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/297363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-07 15:26 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/07/297363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(二)-----读深入浅出hibernate有感 </title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/06/297288.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Tue, 06 Oct 2009 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/06/297288.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/297288.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/06/297288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/297288.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/297288.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; DAO模式实际是2个模式的组合，即Data Accessor和Domain Object模式<br />
&nbsp;&nbsp;&nbsp; Data Accessor即将数据访问的实现机制加以封装，与数据的使用代码相分离，从外部来看，Data Accessor提供了黒盒式的数据存取接口。Domain Object则提供了对所有面向领域内对象的封装。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; DAO模式实现了业务逻辑与数据逻辑的分离。对于专项开发而言，这样的分离设计差不多已经可以实现开发过程中业务层面和数据层面的相对独立，并且在实现复杂性与结构清晰性上达到较好的平衡。<br />
&nbsp;&nbsp;&nbsp; 对于一个产品化的业务系统而言，软件产品往往需要在不同客户环境下即时部署。由于java良好的跨平台支持，我们在操作系统之间大可以轻易迁移，但在另外一个层面，数据库层，却仍然面临着平台迁移的窘境。针对不同的数据库，我们可以实现针对不同类型数据库的Data Accessor，并根据客户实际部署环境，通过类文件的静态替换来实现。这样将大大增加部署和维护工作的难度和复杂性。我们应该将此类因素带来的变动屏蔽在系统之外。<br />
<br />
&nbsp;&nbsp;&nbsp; Factory模式在这里起到连接接口和实现的桥梁作用，通过Factory模式，我们可以根据具体需要加载相应的实现，并将此实现作为所对应接口的一个实例提供给业务层使用：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 为了提高性能，避免每次调用都读取配置文件所引起的大量磁盘操作，采用了HashMap作为DAO缓存实现示例：<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DAOFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;HashMap&nbsp;daoMap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Object&nbsp;getDAO(Class&nbsp;daoInterface){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initial();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;dao&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;daoMap.get(daoInterface);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;dao){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DAOException();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;dao;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;initial(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">==</span><span style="color: #000000;">daoMap){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;daoMap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DAOConfig.load();</span><span style="color: #008000;">//</span><span style="color: #008000;">根据配置文件加载DAO实现配置</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DAOConfig{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Logger&nbsp;logger&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LogManager.getLogger(DAOConfig.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;DAO_CONFIG_FILE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">dao.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;DAO_CONFIG_SECTION&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">DAO</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">&nbsp;HashMap&nbsp;load(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HashMap&nbsp;map&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashMap();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFigLocator&nbsp;jfigLocator&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JFigLocator(DAO_CONFIG_FILE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;&nbsp;prop&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;daoConfig.getSectionAsProperties(DAO_CONFIG_SECTION);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enumeration&nbsp;enumSection&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;prop.keys();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(enumSection.hasMoreElements()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;daoIface&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(String)enumSection.nextElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;daoImpl&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;prop.getProperty(daoIface);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;iface&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ClassToolkit.loadClass(daoIface);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;impl&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ClassToolkit.loadClass(daoImpl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">将接口作为HashMap索引，实现类作为值</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(iface,impl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(ClassNotFoundException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">No&nbsp;Class&nbsp;Found=&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;map;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">configuration</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">section&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="DAO"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entry&nbsp;</span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="net.xiaxin.lab.persistence.dao.iface.CustomerDAO"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="net.xiaxin.lab.persistence.dao.impl.CustomerDAOImp_Mysql"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entry&nbsp;</span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="net.xiaxin.lab.persistence.dao.iface.PromotionDAO"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="net.xiaxin.lab.persistence.dao.impl.PromotionDAOImp_Mysql"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/section</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">configuration</span><span style="color: #0000ff;">&gt;</span></div>
<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ClassToolkit{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Class&nbsp;loadClass(String&nbsp;className){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;cls&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cls&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Thread.currentThread().getContextClassLoader().loadClass(className);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(cls&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cls&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(className);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cls;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
&nbsp;&nbsp;&nbsp; 业务层通过接口调用底层实现，具体的DAO实现类不会出现在我们的业务代码中。而具体实现类在配置文件中加以配置，之后DAOFactory.getDAO方法通过读取配置文件获得当前我们期望使用的实现类的类名，在通过Java Class动态加载机制加载后返回。<br />
<br />
&nbsp;&nbsp;&nbsp; 通过接口与实现的分离，并结合DAOFactory动态加载实现类，我们实现了底层访问实现的参数化配置功能。<br />
&nbsp;&nbsp;&nbsp; 无论有多好的理由，新的设计必须避免影响业务逻辑代码的可读性。没有哪个物业公司能说服你在自己的房屋中增加一条穿堂而过的管道，而理由是为了实施更好的供暖设计，我们的软件也一样。<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/297288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-06 09:23 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/06/297288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate深入浅出(一)-----读深入浅出hibernate有感</title><link>http://www.blogjava.net/wyxdeniro/archive/2009/10/05/297233.html</link><dc:creator>王永庆</dc:creator><author>王永庆</author><pubDate>Mon, 05 Oct 2009 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/wyxdeniro/archive/2009/10/05/297233.html</guid><wfw:comment>http://www.blogjava.net/wyxdeniro/comments/297233.html</wfw:comment><comments>http://www.blogjava.net/wyxdeniro/archive/2009/10/05/297233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyxdeniro/comments/commentRss/297233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyxdeniro/services/trackbacks/297233.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 持久：英文即Persistence,简单来讲，也就是把数据保存到可掉电式存储设备中供之后使用。数据持久化往往意味着将内存中的数据保存到磁盘上加以固化，而持久化的实现过程则大多通过各种关系型数据库来完成。<br />
&nbsp;&nbsp;&nbsp; 持久层：也就是在系统逻辑层面上，专注于实现数据持久化的一个相对独立的领域。<br />
&nbsp;&nbsp;&nbsp; 所谓的持久层，其判定标准<br />
&nbsp;&nbsp;&nbsp; 1、如果表示层发生变化，需要从JSP迁移到Java WebStart Client，我们的数据库代码是否需要重新编译。<br />
&nbsp;&nbsp;&nbsp; 2、如果业务逻辑层发生了变化，那么数据持久化代码是否需要重新编译？<br />
&nbsp;&nbsp;&nbsp; 3、如果地秤数据库持久化机制发生了改变，那么，系统中的非持久化部分代码是否需要重新编译？<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 何谓耦合：就是事务之间的相互关联关系<br />
&nbsp;&nbsp;&nbsp; 何谓解耦：即采用一些手段降低关联的紧密程度。<br />
&nbsp;&nbsp;&nbsp; 我们需要的是一个粒度适中的耦合关系，而并非完全意义上的松耦合。<br />
&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;&nbsp; 软件系统的研发过程中，贯穿了技术层面和业务层面的代码实现过程。程序逻辑必须结合业务领域内相应的数据和系统资源，反映出特定的业务逻辑。对于一个业务系统而言，系统研发的目的是为特定业务提供支持，业务逻辑往往是系统实现的核心。此时，将业务逻辑与数据访问逻辑相分离尤为重要。<br />
<br />
&nbsp;&nbsp;&nbsp; 在业务逻辑的实现过程中，我们应该避免业务逻辑代码中混杂数据访问代码，而同样，数据访问代码中，也应该避免出现业务逻辑代码。<br />
<br />
&nbsp;&nbsp;&nbsp; 通过良好的设计将逻辑结构与物理结构相分离。这里所谓的物理结构并非传统意义上的硬件设备，而是我们所无法控制的系统层面，如底层数据库接口。<br />
<br />
&nbsp;&nbsp;&nbsp; 目标只有一个，底层实现变动的情况下，尽量避免对上层结构产生影响。一个设计良好的持久层实现，即便从oracle切换到mysql数据库，也不会引起大范围的代码变更。<br />
<br />
&nbsp;&nbsp;&nbsp; DAO(Data Access Object)模式，DAO模式实际上是2个模式的组合，即Data Accessor模式和Active Domain Object模式，其中Data Accessor模式实现了数据访问和业务逻辑的分离，而Active Domain Object模式实现了业务数据的对象化封装，一般我们将这2个模式组合使用。<br />
&nbsp;&nbsp;&nbsp; DAO模式通过对业务层提供数据抽象层接口，实现了以下目标：<br />
&nbsp;&nbsp;&nbsp; 1、数据存储逻辑的分离<br />
&nbsp;&nbsp;&nbsp; 通过对数据访问逻辑进行抽象，为上层结构提供抽象化的数据访问接口。业务层无需关心具体的select,insert,update操作，这样，一方面避免了业务代码中混杂JDBC调用语句，使得业务逻辑实现更加清晰，另一方面，由于数据访问接口与数据访问实现相分离，也使得开发人员的专业划分成为可能。<br />
&nbsp;&nbsp;&nbsp; 2、数据访问底层实现的分离<br />
&nbsp;&nbsp;&nbsp; DAO模式通过将数据访问划分为抽象层和实现层，从而分离了数据使用和数据访问的底层实现细节。这意味着业务层与数据访问的底层细节无关，也就是说，我们可以在保持上层结构不变的情况下，通过切换底层实现来修改数据访问的具体机制。<br />
&nbsp;&nbsp;&nbsp; 3、资源管理和调度的分离<br />
&nbsp;&nbsp;&nbsp; 在数据库操作中，资源的管理和调度是一个非常值得关注的主题。大多数系统的性能瓶颈往往并非集中在业务逻辑处理本身。DAO模式将数据访问逻辑从业务逻辑中脱离出来，使得在数据访问层实现统一的资源调度成为可能，通过数据库连接池以及各种缓存机制的配合使用，往往可以在保持上层系统不变的情况下，大幅度提升系统性能。<br />
&nbsp;&nbsp;&nbsp; 4、数据抽象<br />
&nbsp;&nbsp;&nbsp; DAO模式通过对底层数据的封装，为业务层提供一个面向对象的接口，使得业务逻辑开发人员可以面向业务中的实体进行编码。通过引入DAO模式，业务逻辑更加清晰，且富裕形象性和描述性。<br />
<br />
<img src ="http://www.blogjava.net/wyxdeniro/aggbug/297233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyxdeniro/" target="_blank">王永庆</a> 2009-10-05 10:32 <a href="http://www.blogjava.net/wyxdeniro/archive/2009/10/05/297233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>