﻿<?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-void-随笔分类-Hibernate</title><link>http://www.blogjava.net/void241/category/33137.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2015 10:40:06 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2015 10:40:06 GMT</pubDate><ttl>60</ttl><item><title>mysql 自增序列(转)</title><link>http://www.blogjava.net/void241/archive/2015/04/29/424762.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Wed, 29 Apr 2015 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2015/04/29/424762.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/424762.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2015/04/29/424762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/424762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/424762.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1:原理是在建立一个触发器TRIGGER tri_NewBH  在table插入时执行序列计算 mysql&gt; CREATE TABLE tb(BH CHAR(16),content VARCHAR(20),`date` DATETIME,val INT); Query OK, 0 rows affected (0.05 sec)  mysql&gt; mysql&gt; mysql&gt; ...&nbsp;&nbsp;<a href='http://www.blogjava.net/void241/archive/2015/04/29/424762.html'>阅读全文</a><img src ="http://www.blogjava.net/void241/aggbug/424762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2015-04-29 17:33 <a href="http://www.blogjava.net/void241/archive/2015/04/29/424762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【Ｈibernate总结系列】使用举例</title><link>http://www.blogjava.net/void241/archive/2009/06/15/282441.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Mon, 15 Jun 2009 12:36:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2009/06/15/282441.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/282441.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2009/06/15/282441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/282441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/282441.html</trackback:ping><description><![CDATA[<p>&nbsp;<a href="http://www.blogjava.net/amigoxie/archive/2008/01/01/171972.html">http://www.blogjava.net/amigoxie/archive/2008/01/01/171972.html</a></p>
<img src ="http://www.blogjava.net/void241/aggbug/282441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2009-06-15 20:36 <a href="http://www.blogjava.net/void241/archive/2009/06/15/282441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate-投影</title><link>http://www.blogjava.net/void241/archive/2008/07/19/216001.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Sat, 19 Jul 2008 04:16:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2008/07/19/216001.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/216001.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2008/07/19/216001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/216001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/216001.html</trackback:ping><description><![CDATA[<p><tt class="literal"><font face="NSimsun">org.hibernate.criterion.Projections</font></tt>是 <tt class="literal"><font face="NSimsun">Projection</font></tt> 的实例工厂。我们通过调用 <tt class="literal"><font face="NSimsun">setProjection()</font></tt>应用投影到一个查询。</p>
<pre class="programlisting">List results = session.createCriteria(Cat.class)
.setProjection( Projections.rowCount() )
.add( Restrictions.eq("color", Color.BLACK) )
.list();</pre>
<pre class="programlisting">List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount() )
.add( Projections.avg("weight") )
.add( Projections.max("weight") )
.add( Projections.groupProperty("color") )
)
.list();</pre>
<p>在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为<span class="emphasis"><em> 分组投影</em></span>，他们也出现在SQL的<tt class="literal"><font face="NSimsun">group by</font></tt>子句中。</p>
<p>你可以选择把一个别名指派给一个投影，这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式：</p>
<pre class="programlisting">List results = session.createCriteria(Cat.class)
.setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )
.addOrder( Order.asc("colr") )
.list();</pre>
<pre class="programlisting">List results = session.createCriteria(Cat.class)
.setProjection( Projections.groupProperty("color").as("colr") )
.addOrder( Order.asc("colr") )
.list();</pre>
<p><tt class="literal"><font face="NSimsun">alias()</font></tt>和<tt class="literal"><font face="NSimsun">as()</font></tt>方法简便的将一个投影实例包装到另外一个 别名的<tt class="literal"><font face="NSimsun">Projection</font></tt>实例中。简而言之，当你添加一个投影到一个投影列表中时 你可以为它指定一个别名：</p>
<pre class="programlisting">List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount(), "catCountByColor" )
.add( Projections.avg("weight"), "avgWeight" )
.add( Projections.max("weight"), "maxWeight" )
.add( Projections.groupProperty("color"), "color" )
)
.addOrder( Order.desc("catCountByColor") )
.addOrder( Order.desc("avgWeight") )
.list();</pre>
<pre class="programlisting">List results = session.createCriteria(Domestic.class, "cat")
.createAlias("kittens", "kit")
.setProjection( Projections.projectionList()
.add( Projections.property("cat.name"), "catName" )
.add( Projections.property("kit.name"), "kitName" )
)
.addOrder( Order.asc("catName") )
.addOrder( Order.asc("kitName") )
.list();</pre>
<p>你也可以使用<tt class="literal"><font face="NSimsun">Property.forName()</font></tt>来表示投影：</p>
<pre class="programlisting">List results = session.createCriteria(Cat.class)
.setProjection( Property.forName("name") )
.add( Property.forName("color").eq(Color.BLACK) )
.list();</pre>
<pre class="programlisting">List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount().as("catCountByColor") )
.add( Property.forName("weight").avg().as("avgWeight") )
.add( Property.forName("weight").max().as("maxWeight") )
.add( Property.forName("color").group().as("color" )
)
.addOrder( Order.desc("catCountByColor") )
.addOrder( Order.desc("avgWeight") )
.list();</pre>
<img src ="http://www.blogjava.net/void241/aggbug/216001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2008-07-19 12:16 <a href="http://www.blogjava.net/void241/archive/2008/07/19/216001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate-提升性能</title><link>http://www.blogjava.net/void241/archive/2008/07/19/215999.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Sat, 19 Jul 2008 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2008/07/19/215999.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/215999.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2008/07/19/215999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/215999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/215999.html</trackback:ping><description><![CDATA[<p><a href="http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/performance.html">http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/performance.html</a></p>
<img src ="http://www.blogjava.net/void241/aggbug/215999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2008-07-19 12:14 <a href="http://www.blogjava.net/void241/archive/2008/07/19/215999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高Hibernate的效率</title><link>http://www.blogjava.net/void241/archive/2008/07/19/215998.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Sat, 19 Jul 2008 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2008/07/19/215998.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/215998.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2008/07/19/215998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/215998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/215998.html</trackback:ping><description><![CDATA[<p>1、使用hibernate3 <br />
2、使用缓存 <br />
3、尽量使用延时加载 <br />
4、设置合理的batch_size <br />
5、尽量用UUID主键生成机制 <br />
6、用乐观锁代替悲观锁 <br />
7、采用合理的Session管理机制<br />
8、建模时注意不要做过多的关联 <br />
9、预评估结果集，对过大的结果集进行分页处理<br />
10、投影</p>
<img src ="http://www.blogjava.net/void241/aggbug/215998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2008-07-19 12:14 <a href="http://www.blogjava.net/void241/archive/2008/07/19/215998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate性能优化</title><link>http://www.blogjava.net/void241/archive/2008/07/19/215996.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Sat, 19 Jul 2008 04:12:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2008/07/19/215996.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/215996.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2008/07/19/215996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/215996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/215996.html</trackback:ping><description><![CDATA[<p>有很多人认为Hibernate天生效率比较低，确实，在普遍情况下，需要将执行转换为SQL语句的 Hibernate的效率低于直接JDBC存取，然而，在经过比较好的性能优化之后，Hibernate的性能还是让人相当满意的，特别是应用二级缓存之 后，甚至可以获得比较不使用缓存的JDBC更好的性能，下面介绍一些通常的Hibernate的优化策略：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="noted">1.抓取</span>优化<br />
&nbsp;&nbsp;&nbsp;&nbsp; 抓取是指Hibernate如何在关联关系之间进行导航的时候，Hibernate如何获取关联对象的策略，其主要定义了两个方面：如何抓取和何时抓取<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1）如何抓取。<br />
&nbsp;&nbsp;&nbsp;&nbsp; Hibernate3主要有两种种抓取方式，分别应用于对象关联实例(many-to-one、one-to-one)和对象关联集合(set、map等)，总共是四种变种<br />
&nbsp;&nbsp;&nbsp;&nbsp; JOIN抓取： 通过在SELECT语句中使用OUTER JOIN来获得对象的关联实例或者关联集合）<br />
&nbsp;&nbsp;&nbsp;&nbsp; SELECT抓取： 另外发送一条SELECT语句来抓取当前对象的关联实体和集合<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在我的开发经历中，此处对性能的优化是比较有限的，并不值得过多关注<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例：<br />
&nbsp;&nbsp;&nbsp;&nbsp; A.应用于对象关联实例（默认是false）<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name=".." outer-join="true/false/auto"&nbsp;&nbsp; .../&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; B.应用于对象关联集合（默认是auto）<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;set name=".." fetch="join/select" ... &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2）何时抓取<br />
&nbsp;&nbsp;&nbsp;&nbsp; 主要分为延迟加载和立即抓取，默认的情况下Hibernate3对对象关联实采用延迟加载，普通属性采用立即抓取，通过延迟加载和采用适当的抓取粒度，与不采用优化相比往往可以将性能提升数倍<br />
&nbsp;&nbsp;&nbsp;&nbsp; 立即抓取：当抓取宿主对象时，同时抓取其关联对象和关联集以及属性<br />
&nbsp;&nbsp;&nbsp;&nbsp; 延迟加载：当抓取宿主对象时，并不抓取其关联对象，而是当对其对象进行调用时才加载<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例：<br />
&nbsp;&nbsp;&nbsp;&nbsp; A.应用于对象关联实例（默认是延迟加载）<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name=".."&nbsp;&nbsp; lazy="true/false" .../&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; B.应用于对象关联集合（默认是延迟加载）<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;set name=".." lazy="true/false" ... &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 对于延迟加载，需要注意的时，对延迟对象的使用必须在Session关闭之前进行，Hibernate的 LazyInitalizationException往往就是由于在Session的生命期外使用了延迟加载的对象。当我们进行Web开发时，可以使用 OpenSessionInView模式，当请求开始时打开session，当请求响应结束时才关闭session，不过，在使用 OpenSessionInView模式时，需要注意如果响应时间比较长（业务比较复杂或者客户端是低速网络），将Session资源(也就是数据库的连 接)占用太久的话可以会导致资源耗尽<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3）抓取粒度<br />
&nbsp;&nbsp;&nbsp;&nbsp; 抓取粒度指的是对象在关联关系之间被导航时一次预先加载的数量，Hibernate程序的性能比较差往往就在于没有对抓取粒度仔细考虑，当加载一个列表并在列表中的每个对象中对其关联进行导航时，往往导致N+1条SQL语句查询。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 例：<br />
&nbsp;&nbsp;&nbsp;&nbsp; A.应用于对象关联实例（默认为1），注意，对对象关<span class="noted">联实例的设</span>置是在被关联的对象之上的，譬如<br />
&nbsp;&nbsp;&nbsp;&nbsp; class User<br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Group g;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; 那么抓取粒度应该在Group的配置文件之上，见下<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;class name="Group" table="group" batch-size=".."&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 对该值并没有一个约定俗成的值，根据情况而定，如果被关联表数据比较少，则可以设置地小一些，3-20，如果比较大则可以设到30-50，注意的时候，并不是越多越好，当其值超过50之后，对性能并没有多大改善但却无谓地消耗内存<br />
&nbsp;&nbsp;&nbsp;&nbsp; 假设有如下例子：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;User&gt; users = query.list();<br />
&nbsp;&nbsp;&nbsp;&nbsp; 如果有20个User，并对这20个User及其Group进行遍历，如果不设置batch-size（即batch-size="1"），则在最糟糕的情况<br />
&nbsp;&nbsp;&nbsp;&nbsp; 下，需要1 + 20条SQL语句，如果设置batch-size="10"，则最好的情况下只需要1 + 2条SQL语句<br />
&nbsp;&nbsp;&nbsp;&nbsp; B.应用于对象关联集合（默认为1）<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;set name=".." batch-size="" ... &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2.二级缓存<br />
&nbsp;&nbsp;&nbsp;&nbsp; Hibernate 对数据的缓存包括两个级：一级缓存，在Session的级别上进行，主要是对象缓存，以其id为键保存对象，在Session的生命期间存在；二级缓存， 在SessionFactory的级别上进行，有对象缓存和查询缓存，查询缓存以查询条件为键保存查询结果，在SessionFactory的生命期间存 在。默认地，Hibernate只启用一级缓存，通过正确地使用二级缓存，往往可以获得意想不到的性能。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1）对象缓存：<br />
&nbsp;&nbsp;&nbsp;&nbsp; 当抓取一个对象之后，Hiberate将其以id为键缓存起来，当下次碰到抓取id相同的对象时，可以使用如下配置<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方法1：在缓存对象上配置<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;class ...&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;cache useage="read-only/write/...." regions="group" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; useage 表示使用什么类型的缓存，譬如只读缓存、读写缓存等等（具体参见Hibernate参考指南），值得注意的时，有部分缓存在Hibernate的实现中不 支持读写缓存，譬如JBossCache在Hibernate的实现中只是一种只读缓存，具体缓存实现对缓存类型的支持情况，可以参见 org.hibernate.cache包<br />
&nbsp;&nbsp;&nbsp;&nbsp; regions表示缓存分块，大部分的缓存实现往往对缓存进行分块，该部分是可选的，详细参见各缓存实现<br />
&nbsp;&nbsp;&nbsp;&nbsp; 方法2：在hibernate.cfg.xml中配置<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;cache class=".." useage=".." regions=".."/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 我认为第二种更好，可以统一管理<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2)查询缓存<br />
&nbsp;&nbsp;&nbsp;&nbsp; 查询时候将查询结果以查询条件为键保存起来，需要配置如下<br />
&nbsp;&nbsp;&nbsp;&nbsp; A.在hibernate.cfg.xml中配置（启用查询缓存）<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.cache.use_query_cache"&gt;true&lt;/property&gt;&nbsp;&nbsp; （前面的属性名可参见常量<br />
org.hibernate.cfg.Enviroment.USE_QUERY_CACHE）<br />
&nbsp;&nbsp;&nbsp;&nbsp; B.程序<br />
&nbsp;&nbsp;&nbsp;&nbsp; query.setCacheable(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp; query.setCacheRegions(...);<br />
&nbsp;&nbsp;&nbsp;&nbsp; 需要注意的是,查询缓存与对象缓存要结合更有效,因为查询缓存仅缓存查询结果列表的主键数据<br />
&nbsp;&nbsp;&nbsp;&nbsp; 一般情况下在开发中，对一些比较稳定而又被频繁引用的数据，譬如数据字典之类的，将其进行二级缓存，对一些查询条件和查询数据变化不频繁而又常常被使用的 查询，将其进行二级缓存。由于二级缓存是放在内存中，而且Hibernate的缓存不是弱引用缓存（WeekReference），所以注意不要将大块的 数据放入其中，否则可能会被内存造成比较大的压力。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3.批量数据操作<br />
&nbsp;&nbsp;&nbsp;&nbsp; 当进行大批量数据操作（几万甚至几十几百万）时，需要注意两点，一，批量提交，二，及时清除不需要的一级缓存数据<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1） 所谓的批量提交，就是不要频繁使用session的flush，每一次进行flush，Hibernate将PO数据于数据库进行同步，对于海量级数据操 作来说是性能灾难（同时提交几千条数据和提交一条数据flush一次性能差别可能会是几十倍的差异）。一般将数据操作放在事务中，当事务提交时 Hibernate自动帮你进行flush操作。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2）及时清除不需要的一级缓存数据：由于Hibernate默认采用一级缓存，而在 session的生命期间，所有数据抓取之后会放入一级缓存中，而当数据规模比较庞大时，抓取到内存中的数据会让内存压力非常大，一般分批操作数据，被一 次操作之后将一级缓存清除，譬如<br />
&nbsp;&nbsp;&nbsp;&nbsp; session.clear(User.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp; 4.杂项<br />
&nbsp;&nbsp;&nbsp;&nbsp; dynamic-insert，dynamic-update，动态插入和动态更新，指的是让Hibernate插入数据时仅插入非空数据，当修改数据时只修改变化的数据，譬如对于 <br />
&nbsp;&nbsp;&nbsp;&nbsp; class User<br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; 如果u.id=1, u.username="ayufox",u.password=null，那么如果不设置动态插入，则其sql语句是 insert into users(id, username, password) values (1, 'ayufox', ')，如果设置则其 sql语句是insert into users(username) valeus('ayufox')<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在如上的情况下，如果修改 u.password='11'，那么如果不设置动态更新，则sql语句为update users set username='ayufox', password='11' where id = 1，如果设置则为update user set password='11' where d = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp; 设置是在class的映射文件中，如下<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;class name="User" table="users" dynamic=insert="true/false" dynamic-update="true/false" ...&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
　　该设置对性能的提升比较有限 </p>
<img src ="http://www.blogjava.net/void241/aggbug/215996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2008-07-19 12:12 <a href="http://www.blogjava.net/void241/archive/2008/07/19/215996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优化hibernate性能的几点建议</title><link>http://www.blogjava.net/void241/archive/2008/07/19/215995.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Sat, 19 Jul 2008 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2008/07/19/215995.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/215995.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2008/07/19/215995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/215995.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/215995.html</trackback:ping><description><![CDATA[<table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    <tbody>
        <tr>
            <td>1 ＜property name="hibernateProperties"＞<br />
            2 ＜props＞<br />
            3 ＜prop key="hibernate.dialect"＞org.hibernate.dialect.Oracle9Dialect＜/prop＞<br />
            4 ＜prop key="hibernate.show_sql"＞false＜/prop＞<br />
            5 ＜!-- Create/update the database tables automatically when the JVM starts up<br />
            6 ＜prop key="hibernate.hbm2ddl.auto"＞update＜/prop＞ --＞<br />
            7 ＜!-- Turn batching off for better error messages under PostgreSQL<br />
            8 ＜prop key="hibernate.jdbc.batch_size"＞100＜/prop＞ --＞<br />
            9 ＜prop key="hibernate.jdbc.batch_size"＞50＜/prop＞<br />
            10 ＜/props＞<br />
            11 ＜/property＞Fetch Size设的越大，读数据库的次数越少，速度越快；Fetch Size越小，读数据库的次数越多，速度越慢。</td>
        </tr>
    </tbody>
</table>
<br />
　　2、如果是超大的系统，建议生成htm文件。加快页面提升速度。<br />
<br />
　　3、不要把所有的责任推在hibernate上，对代码进行重构，减少对数据库的操作，尽量避免在数据库查询时使用in操作，以及避免递归查询操作，代码质量、系统设计的合理性决定系统性能的高低。<br />
<br />
　　4、对大数据量查询时，慎用list()或者iterator()返回查询结果，<br />
<br />
　　（1）. 使用List()返回结果时，Hibernate会所有查询结果初始化为持久化对象，结果集较大时，会占用很多的处理时间。<br />
<br />
　　（2）. 而使用iterator()返回结果时，在每次调用iterator.next()返回对象并使用对象时，Hibernate才调用查询将对应的对象初始化，对于大数据量时，每调用一次查询都会花费较多的时间。当结果集较大，但是含有较大量相同的数据，或者结果集不是全部都会使用时，使用iterator()才有优势。<br />
<br />
　　5、在一对多、多对一的关系中，使用延迟加载机制，会使不少的对象在使用时方会初始化，这样可使得节省内存空间以及减少数据库的负荷，而且若PO中的集合没有被使用时，就可减少互数据库的交互从而减少处理时间。<br />
<br />
　　6、对含有关联的PO（持久化对象）时，若default-cascade="all"或者 &#8220;save-update&#8221;，新增PO时，请注意对PO中的集合的赋值操作，因为有可能使得多执行一次update操作。<br />
<br />
　　7、对于大数据量新增、修改、删除操作或者是对大数据量的查询，与数据库的交互次数是决定处理时间的最重要因素，减少交互的次数是提升效率的最好途径，所以在开发过程中，请将show_sql设置为true，深入了解Hibernate的处理过程，尝试不同的方式，可以使得效率提升。尽可能对每个页面的显示，对数据库的操作减少到100----150条以内。越少越好。<br />
<br />
　　以上是在进行struts+hibernate+spring进行项目开发中，对hibernate性能优化的几点心得。
<img src ="http://www.blogjava.net/void241/aggbug/215995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2008-07-19 12:11 <a href="http://www.blogjava.net/void241/archive/2008/07/19/215995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate延迟加载</title><link>http://www.blogjava.net/void241/archive/2008/07/19/215994.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Sat, 19 Jul 2008 04:10:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2008/07/19/215994.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/215994.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2008/07/19/215994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/215994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/215994.html</trackback:ping><description><![CDATA[示例数据表：team(班级)、certificate(身份证)、student(学生)<br />
<img style="width: 344px; height: 518px" height="518" src="http://www.blogjava.net/images/blogjava_net/keweibo/mysql.jpg" width="344" border="0"  alt="" /><br />
<span style="color: red"><strong><em><u style="color: #0000ff">Team.hbm.xml</u></em></strong></span><br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;&nbsp;&nbsp; Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;class name="edu.dgut.ke.model.Team" table="TEAM" <span style="color: #ff9900"><strong>lazy ="true"</strong></span> &gt;&lt;!-- 多对一的延迟加载设置 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ID" length="32" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="uuid.hex" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="teamname" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="TEAMNAME" length="32" not-null="true" unique="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set name="students" inverse="true" cascade="all" <span style="color: #00ccff"><strong>lazy="true" </strong></span>&gt; &lt;!-- 一对多的延迟加载设置 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="TEAMID" length="32" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/key&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="edu.dgut.ke.model.Student" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<br />
<span style="color: #0000ff"><u><em><strong>Certificate.hbm.xml</strong></em></u></span><br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;&nbsp;&nbsp; Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;class name="edu.dgut.ke.model.Certificate" table="CERTIFICATE"<strong> <span style="color: #ff00ff">lazy="true"</span></strong> &gt;&lt;!-- 一对一的延迟加载设置 --&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ID" length="32" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="uuid"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="describe" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="`DESCRIBE`" length="50" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-one name="student"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="edu.dgut.ke.model.Student"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff00ff"><strong>constrained="true"</strong></span> &gt;&lt;!-- 一对一的延迟加载设置 --&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/one-to-one&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<br />
<span style="color: #0000ff"><strong><em><u>Student.hbm.xml</u></em></strong></span><br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;&nbsp;&nbsp; Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;class name="edu.dgut.ke.model.Student" table="STUDENT" <span style="color: #ff00ff"><span style="color: #000000">lazy="true" </span></span>&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ID" length="32" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="uuid.hex" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="certificate" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="edu.dgut.ke.model.Certificate"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unique="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column="cardId"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cascade="all"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="team" class="edu.dgut.ke.model.Team"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="TEAMID" length="32" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="studentname" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="STUDENTNAME" length="16" not-null="true" unique="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<span style="color: #ff0000"><strong>注意：对one-to-one 关系进行延迟加载和其他关系相比稍微有些不同。many-to-one 的延迟加载是在配置文件的class 标签<br />
上设置 lazy="true" ，one-to-many 和 many-to-many 的延迟加载是在 set 标签中设置lazy="true"。而one-to-one 不只要在 classs <br />
标签设置 lazy="true"，而且要在one-to-one 标签中设置constrained="true" 。<br />
如果不设置constrained="true"，则一对一查询使用默认的预先抓取策略(fetch="join")。</strong></span><br />
<img src ="http://www.blogjava.net/void241/aggbug/215994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2008-07-19 12:10 <a href="http://www.blogjava.net/void241/archive/2008/07/19/215994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>