﻿<?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-robbie-随笔分类-Hibernate</title><link>http://www.blogjava.net/robbie/category/36350.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 15 May 2012 21:15:05 GMT</lastBuildDate><pubDate>Tue, 15 May 2012 21:15:05 GMT</pubDate><ttl>60</ttl><item><title>关于Hibernate分页、Fetch Join调优的一篇好文章</title><link>http://www.blogjava.net/robbie/archive/2012/05/14/378095.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Mon, 14 May 2012 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2012/05/14/378095.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/378095.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2012/05/14/378095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/378095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/378095.html</trackback:ping><description><![CDATA[<a href="http://java.dzone.com/articles/hibernate-tuning-queries-using?page=0,0">http://java.dzone.com/articles/hibernate-tuning-queries-using?page=0,0</a>&nbsp;<img src ="http://www.blogjava.net/robbie/aggbug/378095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2012-05-14 14:28 <a href="http://www.blogjava.net/robbie/archive/2012/05/14/378095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>没有Hibernate时，我们怎么做项目&amp;hellip;&amp;hellip;</title><link>http://www.blogjava.net/robbie/archive/2009/07/06/285719.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Mon, 06 Jul 2009 14:06:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2009/07/06/285719.html</guid><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 最近在做一个很小的项目的功能改进，小小的项目中原来连接的是MySQL数据库，现在需要新连接一个数据库（Oracle），仅仅从一张表查询数据即可，没有添加、修改、删除等等功能。本来这个小小的项目中用的是Hibernate，现在又要增加一个数据库连接，觉得配置起来有点麻烦，忽然想起来，我干吗还要用Hibernate呢，直接用JDBC不也挺好使么，想了便做，果然写起JDBC来，很是快捷，一会就搞好了。</p>
<p>&nbsp;&nbsp;&nbsp; 做好了以后，忽然觉得有点迷茫，感觉不用Hibernate不也挺好的么，咱为什么现在开口闭口都是Hibernate呢，于是便有了今天的题目。</p>
<p>&nbsp;&nbsp;&nbsp; 很久以前没有Hibernate的时候：</p>
<p>&nbsp;&nbsp;&nbsp; 第一阶段：我们写程序都是直接用JDBC，甚至在JSP页面中直接去createConnection，然后执行查询，输出到页面。</p>
<p>&nbsp;&nbsp;&nbsp; 第二阶段：后来觉得每次都是创建一个连接，好像效率不高，于是看了别人的介绍，要用数据库连接池，好的，那便用数据库连接池吧，每次都从pool中获得一个Connection，然后查询数据。</p>
<p>&nbsp;&nbsp;&nbsp; 第三阶段：用了连接池，还是效率不高，那怎么办呢？用缓存吧，自己实现缓存？可以，也可以用开源的缓存框架。</p>
<p>&nbsp;&nbsp;&nbsp; 第四阶段：到了OO大流行的时代了，一切都要OO，恰逢Hibernate降临人世，于是一切都用Hibernate来实现了，其实同期还是有不少其它ORMAP框架的，比如（TOPLINK、JDO、IBatis等，IBatis国内用的还比较多，另外两个好像用的比较少）。</p>
<p>&nbsp;&nbsp;&nbsp; 第五阶段：忽然EJB大流行，事务的概念被广为传播（并不是原来没有事务的概念，只是实现起来比较麻烦），借助EJB的广为传播，Spring+Hibernate的组合也慢慢占据了大半市场。此时事务用Spring AOP的声明式事务来解决，缓存可以用开源的缓存框架（已经和Hibernate无缝集成了），数据库连接池也是通过配置的方式在SpringContext.xml文件中配置，貌似一切都很完美。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 真的到了第五阶段，一切是不是真的完美了呢，如果一个很小的应用，需要从好几个数据库查询数据，但是每个数据库仅需要查询那么一两张表的数据，偶尔添加、删除几条数据，数据量也不大，此时我们是不是还用第一阶段的方式会更好呢，好像有时配置多数据源也不是那么方便的事情。或者使用Spring中的JDBCTemplate，貌似也不错。</p>
<p>&nbsp;&nbsp;&nbsp; 再往后看，难道Spring+Hibernate的组合就天下无敌了么？难道就没有新的框架了么？前段时间，JavaEye上关于充血模型、贫血模型的讨论吸引了多少眼球，以后是不是会有这么一个框架用于实现充血模型呢？</p>
<p>&nbsp;&nbsp; 说了这么多，最终只是想说明白这么一句：用恰当的技术做恰当的事情，这真是一个艰难的选择&#8230;&#8230;，至于未来，更是迷茫，因为我们只是跟随者，而不是领导者。</p>
<img src ="http://www.blogjava.net/robbie/aggbug/285719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2009-07-06 22:06 <a href="http://www.blogjava.net/robbie/archive/2009/07/06/285719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate缓存配置</title><link>http://www.blogjava.net/robbie/archive/2009/04/07/264359.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Tue, 07 Apr 2009 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2009/04/07/264359.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/264359.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2009/04/07/264359.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/264359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/264359.html</trackback:ping><description><![CDATA[<p>这篇Blog是原来写在别的地方的，今天将其转到BlogJava上来。<br />
-------------------------------------------------------------------------------<br />
<br />
</p>
<p>今天仔仔细细的看了一下Hibernate的缓存，并做了实例实践了一把。google一下，网上的教程、文章很多。<br />
自己小结一下：</p>
<p>Hibernate的缓存分为：</p>
<ul>
    <li>一级缓存：在Session级别的，在Session关闭的时候，一级缓存就失效了。
    <li>二级缓存：在SessionFactory级别的，它可以使用不同的缓存实现，如EhCache、JBossCache、OsCache等。 </li>
</ul>
<p>缓存的注释写法如下，加在Entity的java类上：</p>
<ul>
    <li>@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) </li>
</ul>
<p>缓存的方式有四种，分别为：</p>
<ul>
    <li>CacheConcurrencyStrategy.NONE
    <li>CacheConcurrencyStrategy.READ_ONLY，只读模式，在此模式下，如果对数据进行更新操作，会有异常；
    <li>CacheConcurrencyStrategy.READ_WRITE，读写模式在更新缓存的时候会把缓存里面的数据换成一个锁，其它事务如果去取相应的缓存数据，发现被锁了，直接就去数据库查询；
    <li>CacheConcurrencyStrategy.NONSTRICT_READ_WRITE，不严格的读写模式则不会的缓存数据加锁；
    <li>CacheConcurrencyStrategy.TRANSACTIONAL，事务模式指缓存支持事务，当事务回滚时，缓存也能回滚，只支持JTA环境。 </li>
</ul>
<p>另外还有如下注意事项：</p>
<p>1、查询缓存需要在Query的相应方法执行前加上这么一句： </p>
<p>query.setCacheable(true); </p>
<p>在使用Hibernate时，获得的query有setCacheable方法，可以设置使用缓存，但当使用JPA时，javax.persistence.Query并没有setCacheable方法，此时如果JPA的实现是Hibernate时，可以将其进行如下转化，再调用setCacheable方法（如果JPA的实现是其它ORMAP框架，就不知道怎么做了）。</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(query&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;org.hibernate.ejb.QueryImpl)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; ((org.hibernate.ejb.QueryImpl)&nbsp;query).getHibernateQuery().setCacheable(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
} </span></div>
<p>2、还有就是查询缓存的查询执行后，会将查询结果放入二级缓存中，但是放入的形式是以ID为Key，实例作为一个Value。</p>
<p>3、hibernate的配置文件中需加入如下信息：<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<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: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hibernate.cache.provider_class"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="org.hibernate.cache.EhCacheProvider"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hibernate.cache.use_second_level_cache"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hibernate.cache.use_query_cache"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span></div>
<p><br />
</p>
<img src ="http://www.blogjava.net/robbie/aggbug/264359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2009-04-07 22:54 <a href="http://www.blogjava.net/robbie/archive/2009/04/07/264359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss Envers</title><link>http://www.blogjava.net/robbie/archive/2008/12/04/244266.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Thu, 04 Dec 2008 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/04/244266.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/244266.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/04/244266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/244266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/244266.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JBoss Envers目的是根据对实体的设置，提供记录执行数据变更历史的功能(数据变更版本)。Envers的配置非常简单，如果需要对某个实例进行历史数据版本记录，只需要在实例上配置@Versioned annotation即可。针对每个实体的版本的历史数据,Envers都会创建一个单独的数据表进行存储。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目前Envers支持Hibernate和Hibernate-entitymanager(JPA实现).</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个特点在需要对历史数据进行存档时很实用，而且目前Envers已经合并到Hibernate的新版本中去了，使用起来更方便，具体Hibernate哪个不太清楚。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 留个印记..............</p><img src ="http://www.blogjava.net/robbie/aggbug/244266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-04 09:04 <a href="http://www.blogjava.net/robbie/archive/2008/12/04/244266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Search</title><link>http://www.blogjava.net/robbie/archive/2008/12/01/243686.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Mon, 01 Dec 2008 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2008/12/01/243686.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/243686.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2008/12/01/243686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/243686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/243686.html</trackback:ping><description><![CDATA[<p>今天在<a title="http://refcardz.dzone.com/" href="http://refcardz.dzone.com/">http://refcardz.dzone.com/</a>上下载了《Getting Started with Hibernate Search》，乍一看标题，以为是讲如何使用Hibernate进行查询操作什么的，下载好以后打开一看，原来是Hibernate集成了lucene，用来对自己的数据库进行全文检索，真是厉害！</p>
<p>没有仔细研究具体内容，先记下一笔，日后有时间时，可以实践一把。</p>
<img src ="http://www.blogjava.net/robbie/aggbug/243686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2008-12-01 12:59 <a href="http://www.blogjava.net/robbie/archive/2008/12/01/243686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3.2 与 EJB3.0</title><link>http://www.blogjava.net/robbie/archive/2007/05/10/116593.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Thu, 10 May 2007 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2007/05/10/116593.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/116593.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2007/05/10/116593.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/116593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/116593.html</trackback:ping><description><![CDATA[今天才了解到，Hibernate3.2已经全面支持EJB3.0中的JPA规范。<br />
<br />
看来对新技术了解不够，只顾了看EJB3.0的规范了<img src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/images/emsmile.gif" align="absmiddle" border="0"  alt="" /><br />
<br />
感觉Hibernate3.2全面支持EJB3.0的规范对于EJB3的推广来说是件好事，至少在ORM这方面，一般程序员积累的经验可以很快速的适应EJB3.0的开发。只要继续加强对EJB容器、事务处理等方面的学习，就可以对EJB3有全面完整的了解。比起以前EJB2.1和常用技术的格格不入而言，真的是很大的进步了。
<img src ="http://www.blogjava.net/robbie/aggbug/116593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2007-05-10 21:08 <a href="http://www.blogjava.net/robbie/archive/2007/05/10/116593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>格式化Hibernate的SQL输出语句</title><link>http://www.blogjava.net/robbie/archive/2006/11/24/83383.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Fri, 24 Nov 2006 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2006/11/24/83383.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/83383.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2006/11/24/83383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/83383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/83383.html</trackback:ping><description><![CDATA[今天在网上看到这么一段，很实用：<br />
<br />
<font color="#0000cc">如果想要仔细看Hibernate生成的SQL语句，将format_sql设为true可以很大程度地减轻痛苦&#8230;&#8230;<br />
</font><font color="#0000cc"><span style="font-size: 14pt;"><span style="color: green;"><font size="3"><font color="#0000ff">hibernate.<strong>format_sql</strong> ＝ true</font><br />
</font></span></span>再加上这个的话： <br />
</font><font color="#0000cc"><span style="font-size: 14pt;"><span style="color: blue;"><font size="3">hibernate.<strong>use_sql_comments</strong> ＝ true<br />
</font></span></span>[可读性 + 可定位性]会更好<br />
不过，这两个一起来的话也会造成SQL在console中显示的篇幅很大。</font> 
<img src ="http://www.blogjava.net/robbie/aggbug/83383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2006-11-24 22:24 <a href="http://www.blogjava.net/robbie/archive/2006/11/24/83383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>