﻿<?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/stevenjohn/category/51097.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Fri, 19 Apr 2013 18:44:49 GMT</lastBuildDate><pubDate>Fri, 19 Apr 2013 18:44:49 GMT</pubDate><ttl>60</ttl><item><title>请问hibernate中session应该什么时候关闭</title><link>http://www.blogjava.net/stevenjohn/archive/2013/04/19/398111.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 19 Apr 2013 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/04/19/398111.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/398111.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/04/19/398111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/398111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/398111.html</trackback:ping><description><![CDATA[<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;">我是一个初学者.&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;">我建了一个classes表和一个students表,表示班级和学生,其中学生里面有一个外键关联到班级表.&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;">然后学生类里面建了一个classes的属性,&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;">用session取出学生后,如果关闭session的话,就无法读取到学生类里的classes值,没有关闭就能读取到.&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;">请问这个session会不会影响到其他用户的访问呢?&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;">就是说如果有两个用户并行操作数据库的话,一个用户的session不关闭影不影响另一个用户呢?<br /><br /><br /><br /><br /><br /><br /><br /></span><p style="margin: 10px 0px; padding: 0px; line-height: 24px; font-family: Helvetica, Tahoma, Arial, sans-serif; background-color: #fbeded;">J2EE中最大的一个观念就是分层..&nbsp;<br /><br />session是持久层的东东.不可窜到别的层..&nbsp;<br /><br />你的这个问题其实就是延迟加载的问题.&nbsp;<br /><br />从理论的角度讲,最好是用一个就关一个.防止资源消耗.&nbsp;<br />但由于hibernate中的延迟加载,所以出现了你的关闭session的话,就无法读取到学生类里的classes值问题.&nbsp;<br />这个问题可以用Hibernate.initialize()来解决.也可就使用opensessionview的方式.spring中提供了这样的filter&nbsp;<br />不知道这在使用中有没有使用spring.用了就比较方便,也不会出现你所说的&nbsp;<br /></p><div class="quote_title" style="font-weight: bold; padding: 5px; margin: 5px 0px 0px 15px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;">引用</div><div class="quote_div" style="border: 1px solid #cccccc; margin: 0px 5px 5px 15px; padding: 3px; background-color: #fafafa; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px;">一个用户的session不关闭影不影响另一个用户</div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;">因为session由spring来管理,很安全,不会出现这个种并发问题.&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;">如果只是使用了Hibernate的话,那得注意了.你在servlet中直接创建session就可能出现并发问题,因为session不是线程安全的,而servlet是多线程的.&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;">这时可以使用ThreadLocal来解决这个问题.&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #fbeded;">希望对你有所帮助!</span><br /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f2f8ef;"><br /><br /><br /></span><img src ="http://www.blogjava.net/stevenjohn/aggbug/398111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-04-19 21:28 <a href="http://www.blogjava.net/stevenjohn/archive/2013/04/19/398111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate4之getCurrentSession和openSession</title><link>http://www.blogjava.net/stevenjohn/archive/2013/04/19/398110.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 19 Apr 2013 13:22:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/04/19/398110.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/398110.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/04/19/398110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/398110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/398110.html</trackback:ping><description><![CDATA[<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">在一个应用程序中，</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff; color: blue;">如果DAO层使用Spring的hibernate模板</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">，通过Spring来控制session的生命周期，则首选getCurrentSession&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">使用Hibernate的大多数应用程序需要某种形式的&#8220;上下文相关的&#8221;session，特定的session在整个特定的上下文范围内始终有效。然而，对不同类型的应用程序而言，要给为什么是组成这种&#8220;上下文&#8221;下一个定义通常是困难的；不同的上下文对&#8220;当前&#8221;这个概念定义了不同的范围。在3.0版本之前，使用Hibernate的程序要么采用自行编写的基于ThreadLocal的上下文session（如下面代码），要么采用HibernateUtil这样的辅助类，要么采用第三方框架（比如Spring或Pico)，它们提供了基于代理(proxy)或者基于拦截器(interception)的上下文相关session&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">从3.0.1版本开始，Hibernate增加了SessionFactory.getCurrentSession()方法。一开始，它假定了采用JTA事务，JTA事务 定义了当前session的范围和上下文(scope and context)。Hibernate开发团队坚信，因为有好几个独立的JTA TransactionManager实现稳定可用，不论是否被部署到一个J2EE容器中，大多数(假若不是所有的）应用程序都应该采用JTA事务管理。 基于这一点，采用JTA的上下文相关session可以满足你一切需要。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">更好的是，从3.1开始，SessionFactory.getCurrentSession()的后台实现是可拔插的。因此，我们引入了新的扩展接口 (org.hibernate.context.CurrentSessionContext)和新的配置参数 (hibernate.current_session_context_class)，以便对什么是&#8220;当前session&#8221;的范围和上下文(scope and context)的定义进行拔插。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff; color: blue;">org.hibernate.context.JTASessionContext</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">&nbsp;- 当前session根据JTA来跟踪和界定。这和以前的仅支持JTA的方法是完全一样的。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff; color: blue;">org.hibernate.context.ThreadLocalSessionContext</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">&nbsp;- 当前session通过当前执行的线程来跟踪和界定。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">这两种实现都提供了&#8220;每数据库事务对应一个session&#8221;的编程模型，也称作一请求一事务。即Hibernate的session的生命周期由数据库事务的生存来控制。假若你采用自行编写代码来管理事务（比如，在纯粹的J2SE,或者 JTA/UserTransaction/BMT），建议你使用Hibernate Transaction API来把底层事务实现从你的代码中隐藏掉。如果你在支持CMT的EJB容器中执行，事务边界是声明式定义的，你不需要在代码中进行任何事务或session管理操作。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff; color: red;">1、getCurrentSession()与openSession()的区别</span>&nbsp;<br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">* 采用getCurrentSession()创建的session会绑定到当前线程中，而采用openSession()&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">创建的session则不会&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">* 采用getCurrentSession()创建的session在commit或rollback时会自动关闭，而采用openSession()创建的session必须手动关闭&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff; color: red;">2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置：</span>&nbsp;<br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">* 如果使用的是本地事务（jdbc事务）&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">&lt;property name="hibernate.current_session_context_class"&gt;thread&lt;/property&gt;&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">* 如果使用的是全局事务（jta事务）&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">&lt;property name="hibernate.current_session_context_class"&gt;jta&lt;/property&gt;&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">在SessionFactory启动的时候，Hibernate会根据配置创建相应的CurrentSessionContext，在 getCurrentSession()被调用的时候，实际被执行的方法是CurrentSessionContext.currentSession()。在currentSession()执行时，如果当前Session 为空，currentSession 会调用SessionFactory 的openSession。</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff; color: blue;">所以getCurrentSession() 对于Java EE 来说是更好的获取Session 的方法。</span>&nbsp;<br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">sessionFactory.getCurrentSession()可以完成一系列的工作，当调用时，hibernate将session绑定到当前线程，事务结束后，hibernate将session从当前线程中释放，并且关闭session，当再次调用getCurrentSession()时，将得到一个新的session，并重新开始这一系列工作。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">这样调用方法如下：&nbsp;<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Session&nbsp;session&nbsp;=&nbsp;HibernateUtil.getSessionFactory().getCurrentSession();<br />session.beginTransaction();<br />Event&nbsp;theEvent&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Event();<br />theEvent.setTitle(title);<br />theEvent.setDate(theDate);<br />session.save(theEvent);<br />session.getTransaction().commit();</div><br /><br /><br /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">不需要close session了&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><strong style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">利于ThreadLocal模式管理Session</strong>&nbsp;<br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;">&nbsp;&nbsp; 早在Java1.2推出之时，Java平台中就引入了一个新的支持：java.lang.ThreadLocal，给我们在编写多线程程序时提供了一种新的选择。ThreadLocal是什么呢？其实ThreadLocal并非是一个线程的本地实现版本，它并不是一个Thread，而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单，就是为每一个使用某变量的线程都提供一个该变量值的副本，是每一个线程都可以独立地改变自己的副本，而不会和其它线程的副本冲突。从线程的角度看，就好像每一个线程都完全拥有一个该变量。ThreadLocal是如何做到为每一个线程维护变量的副本的呢？其实实现的思路很简单，在ThreadLocal类中有一个Map，用于存储每一个线程的变量的副本。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: medium; line-height: 25.1875px; background-color: #ffffff;" /><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;HibernateUtil&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;CONFIG_FILE_LOCATION&nbsp;=&nbsp;"/hibernate.cfg.xml";<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">创建一个局部线程变量</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ThreadLocal&lt;Session&gt;&nbsp;THREAD_LOCAL&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ThreadLocal&lt;Session&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Configuration&nbsp;cfg&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Configuration();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;SessionFactory&nbsp;sessionFactory;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;取得当前session对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings("deprecation")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Session&nbsp;currentSession()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;HibernateException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;(Session)THREAD_LOCAL.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(session&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(sessionFactory&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg.configure(CONFIG_FILE_LOCATION);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionFactory&nbsp;=&nbsp;cfg.buildSessionFactory();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("【ERROR】创建SessionFactory对象出错，原因是：");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<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&nbsp;=&nbsp;sessionFactory.openSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THREAD_LOCAL.set(session);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;session;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;closeSession()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;HibernateException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;(Session)&nbsp;THREAD_LOCAL.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THREAD_LOCAL.set(<span style="color: #0000FF; ">null</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(session&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/398110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-04-19 21:22 <a href="http://www.blogjava.net/stevenjohn/archive/2013/04/19/398110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate hql 查询指定字段并获取结果集</title><link>http://www.blogjava.net/stevenjohn/archive/2012/10/25/390219.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 25 Oct 2012 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/10/25/390219.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/390219.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/10/25/390219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/390219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/390219.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; background-color: rgb(239,239,239); text-indent: 0px; font: 13px/22px KaiTi_GB2312; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">在hibernate中，用hql语句查询实体类，采用list方法的返回结果为一个List，该List中封装的对象分为以下三种情况：<br />1.查询全部字段的情况下，如"from 实体类"，list中封装的对象为实体类本身，各属性都将得到填充。<br />2.只查询一个字段，默认情况下，<span style="color: rgb(255,0,0)">list中封装的是Object对象。</span><br />3.查询两个或两个以上的字段，默认情况下，list中封装的是<span style="color: rgb(255,0,0)">Object[]</span>,长度与所查询的字段数一致。<br /></span>
<p style="widows: 2; text-transform: none; background-color: rgb(239,239,239); text-indent: 0px; font: 13px/22px tahoma, 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: KaiTi_GB2312">对于后两种情况，用标签遍历时不太方便，因为无法直接转换成实体类的对象。比较简单的解决方法是：</span></p><span style="widows: 2; text-transform: none; background-color: rgb(239,239,239); text-indent: 0px; font: 13px/22px KaiTi_GB2312; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">の：在hql中使用<span style="color: rgb(255,0,0)">select new 包名.类名(属性1，属性2&#8230;&#8230;) from 实体类，同时在实体类中添加带参的构造方法，参数的个数和顺序与（属性1，属性2&#8230;&#8230;) 保持一致</span>，这样我们得到的list中存放的依然是实体类的对象，所查询到的属性得到了填充，使用起来更为方便。<br /></span>
<p style="widows: 2; text-transform: none; background-color: rgb(239,239,239); text-indent: 0px; font: 13px/22px tahoma, 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: KaiTi_GB2312">　　の：hql查询多表部分字段，<span style="color: rgb(255,0,0)">select new 包名.表1实体类名(表1.属性1，表2.属性2&#8230;&#8230;) from 表1实体类,表2实体类 where 表1.ID=表2.ID（即相关联的字段）</span>，同时在要返回的表1实体类中添加表2的属性和带参的构造方法，参数的个数和顺序与（表1.属性1，表2.属性 2&#8230;&#8230;) 保持一致</span></p>
<p style="widows: 2; text-transform: none; background-color: rgb(239,239,239); text-indent: 0px; font: 13px/22px tahoma, 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: KaiTi_GB2312">例如要查询Problem 中的pid，score，title，totalAccept,totalSubmission,unSee<br /><br /></span></p>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">public class Problem { &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private int pid; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private int score; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private int timeLimit; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private int memoryLimit; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private int totalAccept; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private int totalSubmission; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private int unSee; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private String title; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private String description; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private String input; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; private String output; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp;&nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; public Problem(int pid, int score,String title, int totalAccept, int totalSubmission, &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int unSee) { &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; super(); &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; this.pid = pid; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; this.score = score; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; this.totalAccept = totalAccept; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; this.totalSubmission = totalSubmission; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; this.unSee = unSee; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; this.title = title; &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; } &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; //省略getter 和 setter &nbsp;&nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">} &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">查询语句如下</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; Query query=session.createQuery("select new Problem(pid,score,title,totalAccept,totalSubmission,unSee) from Problem order by pid"); &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; //query.setFirstResult(firstResult); //分页函数 &nbsp;&nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; //query.setMaxResults(maxResutl); &nbsp;&nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp;&nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp; &nbsp; &nbsp; &nbsp; List&lt;Problem&gt; problems=query.list();//返回的还是Problem对象&nbsp;<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><span style="line-height: 24px; background-color: rgb(242,248,239); font-family: Helvetica, Tahoma, Arial, sans-serif">关于hibernate的问题：&nbsp;</span><br style="line-height: 24px; background-color: rgb(242,248,239); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(242,248,239); font-family: Helvetica, Tahoma, Arial, sans-serif">我现在有条&nbsp;</span><br style="line-height: 24px; background-color: rgb(242,248,239); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(242,248,239); font-family: Helvetica, Tahoma, Arial, sans-serif">hql="select s.id,s.name,t.id,t.name from User s,Useraddress t where t.id=s.id"&nbsp;</span><br style="line-height: 24px; background-color: rgb(242,248,239); font-family: Helvetica, Tahoma, Arial, sans-serif" /><br style="line-height: 24px; background-color: rgb(242,248,239); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(242,248,239); font-family: Helvetica, Tahoma, Arial, sans-serif">这条sql里面的User和Useraddress是两个实体类，现在组合查询分别取出来两个实体类里面的两个字段，然后我想再建立一个实体类Result，里面定义这四个结果集里面的字段，能不能执行完这条hql，正好把这个结果集对应到实体类Result里面呢，Result这个实体类，没写映射文件Result.hbm.xml.&nbsp;</span><br style="line-height: 24px; background-color: rgb(242,248,239); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(242,248,239); font-family: Helvetica, Tahoma, Arial, sans-serif">希望能帮下忙</span>&nbsp;<br /><br /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">2种做法&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">创建一个class temp&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">有属性sid,name,tid,sname,tname&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">创建一个构造函数&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">public temp(sid,name,tid,sname,tname)&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">{&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">}&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">1.hql中&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">List&lt;temp&gt;&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">select new temp(s.id,s.name,t.id,t.name) from User s,Useraddress t where t.id=s.id&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">2.List&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">记录的每一行是object[] 遍历&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">object[0] ==s.id&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">object[1] ==s.name&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">object[2] ==t.id&nbsp;</span><br style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 24px; background-color: rgb(251,237,237); font-family: Helvetica, Tahoma, Arial, sans-serif">object[3] ==t.name</span>&nbsp;</div>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;<br /><br /><br /><br /><span style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif">感谢glamey兄弟的文章，正好解决了当前遇到的问题。原文链接如下：</span><a style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif; color: rgb(0,102,0); text-decoration: none" href="http://glamey.iteye.com/blog/721019" target="_blank">http://glamey.iteye.com/blog/721019<br /></a><span style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; 假设我们现在有一个DTO，其属性包括两张表的属性，我们现在需要将sql语句查询得到的内容转为一个DTO对象，其解决方法如下：&nbsp;</span>&nbsp;<br /></p>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">String sql = "select u.userName as userName ，p.title as title ,p.addTime as addTime from user as u,post as p where u.id=p.userId" &nbsp;</div>
<div style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/17px verdana, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">Query q = factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));<br /><br /><span style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif">&nbsp; &nbsp; &nbsp; 上面select中as后面的内容必须和PostVO中属性名一致，这样就可以返回一个针对PostVO的一个集合。&nbsp;</span><br style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实大家可以看下hibernate这一部分的源码就会发现，主要是使用了AliasToBeanResultTransformer这个类，通过sql的查询，会返回数组，然后hibernate根据数据表的映射，自动帮我们来set对应的字段属性，所以标红的部分务必要跟VO中的属性值一直，要不然会报错的。&nbsp;</span><br style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif" /><span style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果需要的话，大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成：&nbsp;</span>&nbsp;<br /><br />
<div>setResultTransformer(new VOResultTransformer(PostVO.class));</div><br /><span style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif">&nbsp; 另外，除了以上glamey的方法外，还有一种方法：&nbsp;</span>&nbsp;<br />
<div>Query q = session.createQuery("select new com.hibernate.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg m");</div>
<div>List&lt;MsgInfo&gt; list=q.list();</div><br /><span style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif">&nbsp; &nbsp; &nbsp;其中，MsgInfo是DTO。</span><span style="line-height: 25px; background-color: rgb(255,255,255); font-family: Helvetica, Tahoma, Arial, sans-serif; color: red">值得注意的是，第二种方法中DTO必须提供带参数的构造方法，并且HQL语句中属性的位置要与构造方法中的位置一一对应。</span>&nbsp;<br /></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/390219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-10-25 14:32 <a href="http://www.blogjava.net/stevenjohn/archive/2012/10/25/390219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 命名查询NamedQuery  </title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/10/387383.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 10 Sep 2012 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/10/387383.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/387383.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/10/387383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/387383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/387383.html</trackback:ping><description><![CDATA[<p>/**<br />&nbsp;* UserBean entity. @author MyEclipse Persistence Tools<br />&nbsp;*/</p>
<p>public class UserBean implements java.io.Serializable {</p>
<p>&nbsp;// Fields</p>
<p>&nbsp;private String id1;<br />&nbsp;private String name1;<br />&nbsp;private java.util.Date createtime1;<br />&nbsp;private String address;</p>
<p>&nbsp;// Constructors</p>
<p>&nbsp;/** default constructor */<br />&nbsp;public UserBean() {<br />&nbsp;}</p>
<p>&nbsp;/** minimal constructor */<br />&nbsp;public UserBean(String id1) {<br />&nbsp;&nbsp;this.id1 = id1;<br />&nbsp;}</p>
<p>&nbsp;/** full constructor */<br />&nbsp;public UserBean(String id1, String name1, java.util.Date createtime1, String address) {<br />&nbsp;&nbsp;this.id1 = id1;<br />&nbsp;&nbsp;this.name1 = name1;<br />&nbsp;&nbsp;this.createtime1 = createtime1;<br />&nbsp;&nbsp;this.address = address;<br />&nbsp;}</p>
<p>&nbsp;// Property accessors</p>
<p>&nbsp;public String getId1() {<br />&nbsp;&nbsp;return this.id1;<br />&nbsp;}</p>
<p>&nbsp;public void setId1(String id1) {<br />&nbsp;&nbsp;this.id1 = id1;<br />&nbsp;}</p>
<p>&nbsp;public String getName1() {<br />&nbsp;&nbsp;return this.name1;<br />&nbsp;}</p>
<p>&nbsp;public void setName1(String name1) {<br />&nbsp;&nbsp;this.name1 = name1;<br />&nbsp;}</p>
<p>&nbsp;public java.util.Date getCreatetime1() {<br />&nbsp;&nbsp;return this.createtime1;<br />&nbsp;}</p>
<p>&nbsp;public void setCreatetime1(java.util.Date createtime1) {<br />&nbsp;&nbsp;this.createtime1 = createtime1;<br />&nbsp;}</p>
<p>&nbsp;public String getAddress() {<br />&nbsp;&nbsp;return this.address;<br />&nbsp;}</p>
<p>&nbsp;public void setAddress(String address) {<br />&nbsp;&nbsp;this.address = address;<br />&nbsp;}</p>
<p>}<br /><br /><br /><br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />"<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a>"&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="com.lcdbtsf.air.po.UserBean" table="ABIN5" schema="ABIN" dynamic-update="true"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id1" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ID1" precision="0" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="assigned" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="name1" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="NAME1" default="defaultname1"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="createtime1" type="java.util.Date"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="CREATETIME1" length="19" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="address" type="string" update="true"&nbsp; access="field" insert="true"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ADDRESS" default="defaultaddress" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;query name="getUserBeanByAddress"&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&lt;![CDATA[select o from UserBean o where o.address=:address order by o.createtime1 desc]]&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/query&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 命名查询中使用sql，不推荐使用，影响跨数据库<br />&nbsp;&nbsp;&nbsp; &lt;sql-query name="getUserBeanByAddress"&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&lt;![CDATA[select o from UserBean o where o.address=:address order by o.createtime1 desc]]&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/sql-query&gt;<br />&nbsp;&nbsp;&nbsp; --&gt;<br />&nbsp;&nbsp;&nbsp; <br />&lt;/hibernate-mapping&gt;<br /><br /><br /><br /><br /></p>
<p>package com.abin.lee.hibernate;</p>
<p>import java.util.List;</p>
<p>import junit.framework.TestCase;</p>
<p>import org.hibernate.Criteria;<br />import org.hibernate.HibernateException;<br />import org.hibernate.Query;<br />import org.hibernate.Session;<br />import org.hibernate.SessionFactory;<br />import org.hibernate.Transaction;<br />import org.hibernate.cfg.Configuration;<br />import org.hibernate.criterion.Order;</p>
<p>import com.lcdbtsf.air.po.UserBean;</p>
<p>public class UserDao extends TestCase {</p>
<p>&nbsp;public&nbsp; List&lt;UserBean&gt; getAll(){<br />&nbsp;&nbsp;Configuration cfg = new Configuration().configure(); // 获取hibernate的配置信息<br />&nbsp;&nbsp;SessionFactory sf = cfg.buildSessionFactory(); // 根据config建立sessionFactory<br />&nbsp;&nbsp;Session session = sf.openSession(); // factory用于建立session，开启Session，相当于开启JDBC的Connection<br />&nbsp;&nbsp;Transaction ts = session.beginTransaction(); // 创建事务的对象ts<br />&nbsp;&nbsp;List&lt;UserBean&gt; list=null;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Criteria criteria=session.createCriteria(UserBean.class);<br />&nbsp;&nbsp;&nbsp;criteria.addOrder(Order.desc("createtime1"));<br />&nbsp;&nbsp;&nbsp;list=criteria.list();<br />&nbsp;&nbsp;&nbsp;ts.commit();<br />&nbsp;&nbsp;} catch (HibernateException he) {<br />&nbsp;&nbsp;&nbsp;he.printStackTrace();<br />&nbsp;&nbsp;&nbsp;ts.rollback();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return list;<br />&nbsp;}<br />&nbsp;<br />&nbsp;public&nbsp; List&lt;UserBean&gt; getAllByAddress(String address){<br />&nbsp;&nbsp;Configuration cfg = new Configuration().configure(); // 获取hibernate的配置信息<br />&nbsp;&nbsp;SessionFactory sf = cfg.buildSessionFactory(); // 根据config建立sessionFactory<br />&nbsp;&nbsp;Session session = sf.openSession(); // factory用于建立session，开启Session，相当于开启JDBC的Connection<br />&nbsp;&nbsp;Transaction ts = session.beginTransaction(); // 创建事务的对象ts<br />&nbsp;&nbsp;List&lt;UserBean&gt; list=null;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Query query=session.getNamedQuery("getUserBeanByAddress");<br />&nbsp;&nbsp;&nbsp;query.setParameter("address", address);<br />&nbsp;&nbsp;&nbsp;list=query.list();<br />&nbsp;&nbsp;&nbsp;ts.commit();<br />&nbsp;&nbsp;} catch (HibernateException he) {<br />&nbsp;&nbsp;&nbsp;he.printStackTrace();<br />&nbsp;&nbsp;&nbsp;ts.rollback();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return list;<br />&nbsp;}</p>
<p>}<br /></p>
<p><br /><br /><br /><br /></p>
<p>package com.abin.lee.hibernate;</p>
<p>import java.util.List;</p>
<p>import junit.framework.TestCase;</p>
<p>import org.hibernate.HibernateException;<br />import org.hibernate.Session;<br />import org.hibernate.SessionFactory;<br />import org.hibernate.Transaction;<br />import org.hibernate.cfg.Configuration;</p>
<p>import com.lcdbtsf.air.po.UserBean;</p>
<p>public class UserDaoTest extends TestCase {</p>
<p>&nbsp;public void test() {<br />&nbsp;&nbsp;&nbsp;List&lt;UserBean&gt; list=new UserDao().getAllByAddress("shanghai");<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;if(list.size()&gt;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;UserBean user =list.get(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(list.get(0).getId1());<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;} catch (HibernateException he) {<br />&nbsp;&nbsp;&nbsp;he.printStackTrace();&nbsp;&nbsp;}<br />&nbsp;}<br /><br />}<br /></p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/387383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-10 13:28 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/10/387383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 中 Criteria 的使用介绍</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/07/387209.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 06 Sep 2012 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/07/387209.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/387209.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/07/387209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/387209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/387209.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要对资料库管理系统进行操作，最基本的就是使用SQL（Standard Query Language）语句，大部份的资料库都支援标准的SQL语句，然而也有一些特定于资料库的SQL语句，应用程式配合SQL语句进行资料库查询时，若使用到特定于资料库的SQL语句，程式本身会有相依于特定资料库的问题。使用Hibernate时，即使您不了解SQL的使用与撰写，也可以使用它所提供的API来进行SQL语句查询，o...&nbsp;&nbsp;<a href='http://www.blogjava.net/stevenjohn/archive/2012/09/07/387209.html'>阅读全文</a><img src ="http://www.blogjava.net/stevenjohn/aggbug/387209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-07 00:04 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/07/387209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Criteria</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/06/387208.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 06 Sep 2012 15:59:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/06/387208.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/387208.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/06/387208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/387208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/387208.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/alex197963/article/details/2628196">
<h3 style="padding-bottom: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; font-size: medium; font-weight: normal; padding-top: 0px" class="t"></a><a href="http://www.baidu.com/link?url=f8c29760de3136591c7af634b88bedb395d4c7de2814b7f16dd09b84eedf5b3d3f47b4f22bdda68e70fe409835fe86390ab15618f16cc7b7b048fae71644475add287d868beaa095f36935d8c2fec7157f594d0d0083ac73a86f4b5e9ae8d47a8f5759650d4bd2c0e11adee2dc5067c037bd33aa8ae68875065d09971fa642e5e76dad1076c74532a715a9ab3c888cb5a8debb4892034dbee12e6e4d7476f97ae2608c719ef436294a801dfec6f1a1d97ebd565182af3e1195e129fc1ffd61b89bc72d413acb40fa0dd3c611458278176c6218b6a0bef8809f58c23e64429df7f58c68b62f8c89385f4b9cb15ce26081118785dc7b63fdd520304c85c658b5c88a7647f99ac183f3e828c75ffe6cc0736696984bb2fce3940ef473e635401469afba378b8c1ed5d3ea5b53c98af90912882f9bd7eeebbd8e913d9da746ae3e2a7a7d2e0d4f25680fe22e142a5c4111932b53945873f7c6dda974916dc37eebac5573358cc3c0659257bfcf546427d385ecf27a3bb811156a02d96daf01392fe56bad33ab6991a404b710b15e3dfca3439b8f25bfd5404b2461130108f9c3d32ed9d6e36c89ac359dee8f5dc5" target="_blank" data-click="{    'F':'778317EA',    'F1':'9D33F1E4',    'F2':'4CA6DE6B',    'F3':'54E5243F',    'T':'1346946285',        'y':'C7DFFDFB'         }"><font style="text-decoration: underline" color="#cc0000">hibernate</font><span class="Apple-converted-space">&nbsp;</span>中<span class="Apple-converted-space">&nbsp;</span><font style="text-decoration: underline" color="#cc0000">Criteria</font><span class="Apple-converted-space">&nbsp;</span>的使用介绍</a><a href="http://blog.csdn.net/alex197963/article/details/2628196"></h3><br />http://blog.csdn.net/alex197963/article/details/2628196</a><img src ="http://www.blogjava.net/stevenjohn/aggbug/387208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-06 23:59 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/06/387208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 调用oracle存储过程</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/06/387203.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 06 Sep 2012 15:21:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/06/387203.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/387203.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/06/387203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/387203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/387203.html</trackback:ping><description><![CDATA[<p>package com.abin.lee.bean;</p>
<p>/**<br />&nbsp;* Userbean entity. @author MyEclipse Persistence Tools<br />&nbsp;*/</p>
<p>public class UserBean implements java.io.Serializable {</p>
<p>&nbsp;// Fields</p>
<p>&nbsp;private String id;<br />&nbsp;private String username;<br />&nbsp;private String password;</p>
<p>&nbsp;// Constructors</p>
<p>&nbsp;/** default constructor */<br />&nbsp;public UserBean() {<br />&nbsp;}</p>
<p>&nbsp;/** minimal constructor */<br />&nbsp;public UserBean(String id) {<br />&nbsp;&nbsp;this.id = id;<br />&nbsp;}</p>
<p>&nbsp;/** full constructor */<br />&nbsp;public UserBean(String id, String username, String password) {<br />&nbsp;&nbsp;this.id = id;<br />&nbsp;&nbsp;this.username = username;<br />&nbsp;&nbsp;this.password = password;<br />&nbsp;}</p>
<p>&nbsp;// Property accessors</p>
<p>&nbsp;public String getId() {<br />&nbsp;&nbsp;return this.id;<br />&nbsp;}</p>
<p>&nbsp;public void setId(String id) {<br />&nbsp;&nbsp;this.id = id;<br />&nbsp;}</p>
<p>&nbsp;public String getUsername() {<br />&nbsp;&nbsp;return this.username;<br />&nbsp;}</p>
<p>&nbsp;public void setUsername(String username) {<br />&nbsp;&nbsp;this.username = username;<br />&nbsp;}</p>
<p>&nbsp;public String getPassword() {<br />&nbsp;&nbsp;return this.password;<br />&nbsp;}</p>
<p>&nbsp;public void setPassword(String password) {<br />&nbsp;&nbsp;this.password = password;<br />&nbsp;}</p>
<p>}</p><br /><br /><br /><br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />"<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a>"&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="com.abin.lee.bean.UserBean" table="USERBEAN" schema="ABING"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ID" length="80" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="assigned" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="username" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="USERNAME" length="80" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="PASSWORD" length="80" /&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 /><br /><br /><br /><br /><br /><br />
<p>package com.abin.lee.dao;</p>
<p>import java.sql.SQLException;</p>
<p>import org.hibernate.SQLQuery;<br />import org.hibernate.Session;<br />import org.hibernate.SessionFactory;<br />import org.hibernate.Transaction;<br />import org.hibernate.cfg.Configuration;</p>
<p>public class UserDao {<br />&nbsp;private static final ThreadLocal&lt;Session&gt; threadLocal = new ThreadLocal&lt;Session&gt;();<br />&nbsp;private static SessionFactory sessionFactory;<br />&nbsp;static {<br />&nbsp;&nbsp;sessionFactory=new Configuration().configure().buildSessionFactory();<br />&nbsp;}<br />&nbsp;public static Session GetSession(){<br />&nbsp;&nbsp;Session session=(Session)threadLocal.get();<br />&nbsp;&nbsp;if(null == session|| !session.isOpen()){<br />&nbsp;&nbsp;&nbsp;if(null==sessionFactory){<br />&nbsp;&nbsp;&nbsp;&nbsp;sessionFactory=new Configuration().configure().buildSessionFactory();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;session=(sessionFactory!=null)?sessionFactory.openSession():null;<br />&nbsp;&nbsp;&nbsp;threadLocal.set(session);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return session;<br />&nbsp;}<br />&nbsp;<br />&nbsp;public static int insert(String id,String usr,String pwd) throws SQLException{<br />&nbsp;&nbsp;UserDao UserDao=new UserDao();<br />&nbsp;&nbsp;Session session=UserDao.GetSession();<br />&nbsp;&nbsp;Transaction tx=session.beginTransaction();<br />&nbsp;&nbsp;SQLQuery sqlQuery = session.createSQLQuery("{call insertObj(?,?,?)}");<br />&nbsp;&nbsp;sqlQuery.setParameter(0, id);<br />&nbsp;&nbsp;sqlQuery.setParameter(1, usr);<br />&nbsp;&nbsp;sqlQuery.setParameter(2, pwd);<br />&nbsp;&nbsp;int result=sqlQuery.executeUpdate();<br />&nbsp;&nbsp;System.out.println("result="+result);<br />&nbsp;&nbsp;return result;<br />&nbsp;}<br />&nbsp;<br />}<br /></p><br /><br /><br /><br /><br />
<p>package com.abin.lee.test;</p>
<p>import java.sql.SQLException;</p>
<p>import junit.framework.TestCase;</p>
<p>import com.abin.lee.dao.UserDao;</p>
<p>public class UserTest extends TestCase{<br />&nbsp;public void test() throws SQLException{<br />&nbsp;&nbsp;UserDao user=new UserDao();<br />&nbsp;&nbsp;int success=user.insert("abin","abing","bing");<br />&nbsp;&nbsp;System.out.println("success="+success);<br />&nbsp;}<br />}<br /></p><br /><br /><br /><br /><br /><br /><br />
<p>&lt;?xml version='1.0' encoding='UTF-8'?&gt;<br />&lt;!DOCTYPE hibernate-configuration PUBLIC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Hibernate/Hibernate Configuration DTD 3.0//EN"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd</a>"&gt;</p>
<p>&lt;!-- Generated by MyEclipse Hibernate Tools.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />&lt;hibernate-configuration&gt;</p>
<p>&nbsp;&lt;session-factory&gt;<br />&nbsp;&nbsp;&lt;property name="dialect"&gt;<br />&nbsp;&nbsp;&nbsp;org.hibernate.dialect.OracleDialect<br />&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&lt;property name="connection.url"&gt;<br />&nbsp;&nbsp;&nbsp;jdbc:oracle:thin:@localhost:1521:xe<br />&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&lt;property name="connection.username"&gt;abing&lt;/property&gt;<br />&nbsp;&nbsp;&lt;property name="connection.password"&gt;abing&lt;/property&gt;<br />&nbsp;&nbsp;&lt;property name="connection.driver_class"&gt;<br />&nbsp;&nbsp;&nbsp;oracle.jdbc.driver.OracleDriver<br />&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&lt;property name="myeclipse.connection.profile"&gt;<br />&nbsp;&nbsp;&nbsp;OracleConnection<br />&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&lt;mapping resource="com/abin/lee/bean/UserBean.hbm.xml" /&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;/session-factory&gt;</p>
<p>&lt;/hibernate-configuration&gt;</p><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/387203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-06 23:21 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/06/387203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate  分页方法</title><link>http://www.blogjava.net/stevenjohn/archive/2012/05/17/378423.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 17 May 2012 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/05/17/378423.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/378423.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/05/17/378423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/378423.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/378423.html</trackback:ping><description><![CDATA[**<br />* 使用hql 语句进行操作<br /><br />&nbsp;&nbsp; * @param hql<br />* @param offset<br />* @param length<br />* @return List<br />*/<br />public List getListForPage(final String hql, final int offset,<br />&nbsp;&nbsp;&nbsp; final int length) {<br />&nbsp;&nbsp; List list = getHibernateTemplate().executeFind(new HibernateCallback() {<br />&nbsp;&nbsp;&nbsp; public Object doInHibernate(Session session)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws HibernateException, SQLException {<br />&nbsp;&nbsp;&nbsp;&nbsp; Query query = session.createQuery(hql);<br />&nbsp;&nbsp;&nbsp;&nbsp; query.setFirstResult(offset);<br />&nbsp;&nbsp;&nbsp;&nbsp; query.setMaxResults(length);<br />&nbsp;&nbsp;&nbsp;&nbsp; List list = query.list();<br />&nbsp;&nbsp;&nbsp;&nbsp; return list;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; });<br />&nbsp;&nbsp; return list;<br />}/**<br />* 使用criterion进行操作<br />* @param arg<br />* @param criterions<br />* @param offset<br />* @param length<br />* @return List<br />*/<br />protected List getListForPage(final Class arg, final Criterion[] criterions,final int offset, final int length) {<br />&nbsp;&nbsp; List list = getHibernateTemplate().executeFind(new HibernateCallback() {<br />&nbsp;&nbsp;&nbsp; public Object doInHibernate(Session session)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws HibernateException, SQLException {<br />&nbsp;&nbsp;&nbsp;&nbsp; Criteria criteria = session.createCriteria(arg);<br />&nbsp;&nbsp;&nbsp;&nbsp; //循环遍历添加约束条件<br />&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; criterions.length; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.add(criterions[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; criteria.setFirstResult(offset);<br />&nbsp;&nbsp;&nbsp;&nbsp; criteria.setMaxResults(length);<br />&nbsp;&nbsp;&nbsp;&nbsp; return criteria.list();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; });<br />&nbsp;&nbsp; return list;<br />} <br /><br />你不是说你用HibernateTemplate了，如果你用的是spring的HibernateTemplate，那么就直接用就行了，如果你是自己写的template，<br />那你也应该会准备一个HibernateCallback类啊，这才是典型的模板加回调啊 <br /><br />算了，把HibernateCallback也给你贴出来<br /><br />import org.hibernate.HibernateException;<br />import org.hibernate.Session;<br /><br />/*************************************<br />* 为 Hibernate 所提供的一个 回调接口，<br />* 此接口定义了 统一 Hibernate的业务操作；<br />* @author kenshin<br />*<br />*/<br />public interface HibernateCallback {<br /><br />/**************************************<br />&nbsp; * 回调接口的回调方法，此方法使用者无需调用,<br />&nbsp; * 它由 模板类来进行回调，并传入一个 session参数，<br />&nbsp; * 以便让使用者完成相关业务<br />&nbsp; * @param ses<br />&nbsp; * @return 执行结果<br />&nbsp; * @throws HibernateException<br />&nbsp; */<br />Object doInHibernate(Session ses)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws HibernateException;<br /><br />}<img src ="http://www.blogjava.net/stevenjohn/aggbug/378423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-05-17 16:54 <a href="http://www.blogjava.net/stevenjohn/archive/2012/05/17/378423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+Hibernate下配置Hibernate二级缓存EhCache  </title><link>http://www.blogjava.net/stevenjohn/archive/2012/05/13/378025.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 12 May 2012 18:07:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/05/13/378025.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/378025.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/05/13/378025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/378025.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/378025.html</trackback:ping><description><![CDATA[<p>假设类A为持久化对象，对应表为tableA，这里没有考虑A和其他表关联的情况。</p>
<p>在spring下配置使用二级缓存：</p>
<p>&lt;property name="hibernateProperties"&gt;<br />&lt;props&gt;<br />........<br />&lt;prop key="hibernate.cache.provider_class"&gt;${hibernate.cache.provider_class}&lt;/prop&gt;<br />&lt;prop key="hibernate.cache.use_query_cache"&gt;${hibernate.cache.use_query_cache}&lt;/prop&gt;<br />&lt;/props&gt;<br />&lt;/property&gt;<br /><br />其中${hibernate.cache.provider_class}为net.sf.ehcache.hibernate.EhCacheProvider，${hibernate.cache.use_query_cache}属性值为true（对经常使用的List查询方式，只有在使用查询缓存时，才会从缓存中通过id去get缓存的值；查询缓存一般缓存查询语句和查询结果的id）</p>
<p>A的持久化映射文件中加上cache元素：usage属性的取值根据自己的情况自己指定相应的值</p>
<p>&lt;cache usage="read-write"/&gt;<br /><br />配置spring的HibernateTemplate对查询语句和结果缓存（cacheQueries值为true)：</p>
<p>&lt;bean id="hibernateTemplate" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;&lt;ref bean="sessionFactory"/&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name="cacheQueries" value="${hibernate.cache.use_query_cache}"&gt;&lt;/property&gt;<br />&lt;/bean&gt;<br />开发的spring dao（集成HibernateDaoSupport）应该配置实用这个hibernateTemplate：</p>
<p>&lt;bean id="myDao" of HibernateDaoSupport"&gt;<br />&lt;property name="hibernateTemplate" ref="hibernateTemplate" /&gt;<br />&lt;property name="jdbcTemplate" ref="jdbcTemplate" /&gt;<br />&lt;/bean&gt;</p>
<p>在src下新建ehcache.xml文件，文件内容如下：</p>
<p>&lt;ehcache&gt;<br />&lt;diskStore path="java.io.tmpdir"/&gt;</p>
<p>&lt;!-- <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal:元素是否永久的;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemoryStoreEvictionPolicy:default is LRU<br />&nbsp;&nbsp;&nbsp; --&gt;<br />&lt;defaultCache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory="10000"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal="false"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToIdleSeconds="120"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToLiveSeconds="120"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overflowToDisk="true"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diskPersistent="false"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diskExpiryThreadIntervalSeconds="120"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memoryStoreEvictionPolicy="LRU"/&gt;</p>
<p>&lt;cache name="cn.hnisi.persistence.mmedia.Dmtjbxx"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory="500"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal="false"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToIdleSeconds="2400"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToLiveSeconds="3600"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overflowToDisk="false"/&gt;</p>
<p>&lt;cache name="org.hibernate.cache.StandardQueryCache" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory="50" eternal="false" timeToIdleSeconds="600" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToLiveSeconds="1200" overflowToDisk="false"/&gt; <br /><br />&lt;cache name="org.hibernate.cache.UpdateTimestampsCache" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory="500" eternal="true" overflowToDisk="false"/&gt;</p>
<p>&lt;/ehcache&gt;<br />然后你可以使用HQL查询对象了，比如"from A where name=？"；</p>
<p>跟踪查询的sql日志就可以看出第一次是查询数据库，第二次是从缓存中get(见Hibernate ReadWriteCache类的get方法）</p>
<p>问题：什么样的数据适合存放到第二级缓存中？</p>
<p>1 很少被修改的数据<br />2 不是很重要的数据，允许出现偶尔并发的数据<br />3 不会被并发访问的数据<br />4 参考数据,指的是供应用参考的常量数据，它的实例数目有限，它的实例会被许多其他类的实例引用，实例极少或者从来不会被修改。</p>
<p><br />本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/selley/archive/2008/03/13/2177479.aspx" rel="nofollow"><font color="#58992a">http://blog.csdn.net/selley/archive/2008/03/13/2177479.aspx</font></a></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/378025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-05-13 02:07 <a href="http://www.blogjava.net/stevenjohn/archive/2012/05/13/378025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HibernateTransactionManager 和 hibernateTemplate的区别</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/27/372857.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 27 Mar 2012 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/27/372857.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/372857.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/27/372857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/372857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/372857.html</trackback:ping><description><![CDATA[<span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 20px/30px 'Microsoft YaHei'; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><a style="color: rgb(102,102,102); text-decoration: none" href="http://blog.csdn.net/ssyan/article/details/7064146"><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"> 
<div class="bct fc05 fc11 nbw-blog ztag js-fs2">
<div>
<p><span style="font-size: 18px">在applicationContext.xml中有如下配置：</span></p>
<p><span style="font-size: 18px">&lt;bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="sessionFactory"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&lt;/bean&gt;</span></p>
<p><br /><span style="font-size: 18px">也可以：<br />&lt;bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="sessionFactory"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&lt;/bean&gt;</span></p>
<p><span style="font-size: 18px">两种实现方式其实没有区别，尤其是第二种不要自己去关闭session，session在事务结束后都会自动关闭。 但是一定要注意延迟加载的问题，当对象在session关闭前没有从数据库中取得，而jsp中需要展示对象时，会提示LazyInitializationException，你可以通过OpenSessionInViewFilter来保证延迟加载不会出现错误，即：<br />&lt;filter&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;opensession&lt;/filter-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt;<br />&lt;/filter&gt;<br />&lt;filter-mapping&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;opensession&lt;/filter-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;</span></p></div></div></span><br class="Apple-interchange-newline" /></a></span><img src ="http://www.blogjava.net/stevenjohn/aggbug/372857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-27 22:30 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/27/372857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate泛型DAO（结合spring模板支持）</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/20/372320.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 20 Mar 2012 14:20:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/20/372320.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/372320.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/20/372320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/372320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/372320.html</trackback:ping><description><![CDATA[<span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(246,246,246); text-indent: 0px; font: 14px/21px simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(73,73,73); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">详细介绍 Hibernate 泛型 DAO 及其使用方法<br />编写Spring+Hibernate框架下的应用，总是离不了编写一个通用的泛型GenericHibernateDao。查阅了网上不少的GenericHibernateDao实现，归纳整理为如下实现，供后续编码参考。<br /><br />首先定义接口泛型DAO接口 GenericDao<br /><br />package com.th.huz;<br /><br />import java.io.Serializable;<br />import java.util.Collection;<br />import java.util.Iterator;<br />import java.util.List;<br />import org.hibernate.Criteria;<br />import org.hibernate.LockMode;<br />import org.hibernate.criterion.DetachedCriteria;<br /><br /><br />public interface GenericDao&lt;T extends Serializable, PK extends Serializable&gt; {<br />// -------------------- 基本检索、增加、修改、删除操作 --------------------<br /><br />// 根据主键获取实体。如果没有相应的实体，返回 null。<br />public T get(PK id);<br /><br />// 根据主键获取实体并加锁。如果没有相应的实体，返回 null。<br />public T getWithLock(PK id, LockMode lock);<br /><br />// 根据主键获取实体。如果没有相应的实体，抛出异常。<br />public T load(PK id);<br /><br />// 根据主键获取实体并加锁。如果没有相应的实体，抛出异常。<br />public T loadWithLock(PK id, LockMode lock);<br /><br />// 获取全部实体。<br />public List&lt;T&gt; loadAll();<br /><br />// loadAllWithLock() ?<br /><br />// 更新实体<br />public void update(T entity);<br /><br />// 更新实体并加锁<br />public void updateWithLock(T entity, LockMode lock);<br /><br />// 存储实体到数据库<br />public void save(T entity);<br /><br />// saveWithLock()<br /><br />// 增加或更新实体<br />public void saveOrUpdate(T entity);<br /><br />// 增加或更新集合中的全部实体<br />public void saveOrUpdateAll(Collection&lt;T&gt; entities);<br /><br />// 删除指定的实体<br />public void delete(T entity);<br /><br />// 加锁并删除指定的实体<br />public void deleteWithLock(T entity, LockMode lock);<br /><br />// 根据主键删除指定实体<br />public void deleteByKey(PK id);<br /><br />// 根据主键加锁并删除指定的实体<br />public void deleteByKeyWithLock(PK id, LockMode lock);<br /><br />// 删除集合中的全部实体<br />public void deleteAll(Collection&lt;T&gt; entities);<br /><br />// -------------------- HSQL ----------------------------------------------<br /><br />// 使用HSQL语句直接增加、更新、删除实体<br />public int bulkUpdate(String queryString);<br /><br />// 使用带参数的HSQL语句增加、更新、删除实体<br />public int bulkUpdate(String queryString, Object[] values);<br /><br />// 使用HSQL语句检索数据<br />public List find(String queryString);<br /><br />// 使用带参数的HSQL语句检索数据<br />public List find(String queryString, Object[] values);<br /><br />// 使用带命名的参数的HSQL语句检索数据<br />public List findByNamedParam(String queryString, String[] paramNames,<br />Object[] values);<br /><br />// 使用命名的HSQL语句检索数据<br />public List findByNamedQuery(String queryName);<br /><br />// 使用带参数的命名HSQL语句检索数据<br />public List findByNamedQuery(String queryName, Object[] values);<br /><br />// 使用带命名参数的命名HSQL语句检索数据<br />public List findByNamedQueryAndNamed<wbr>Param(String queryName,<br />String[] paramNames, Object[] values);<br /><br />// 使用HSQL语句检索数据，返回 Iterator<br />public Iterator iterate(String queryString);<br /><br />// 使用带参数HSQL语句检索数据，返回 Iterator<br />public Iterator iterate(String queryString, Object[] values);<br /><br />// 关闭检索返回的 Iterator<br />public void closeIterator(Iterator it);<br /><br />// -------------------------------- Criteria ------------------------------<br /><br />// 创建与会话无关的检索标准对象<br />public DetachedCriteria createDetachedCriteria();<br /><br />// 创建与会话绑定的检索标准对象<br />public Criteria createCriteria();<br /><br />// 使用指定的检索标准检索数据<br />public List findByCriteria(DetachedCriteria criteria);<br /><br />// 使用指定的检索标准检索数据，返回部分记录<br />public List findByCriteria(DetachedCriteria criteria, int firstResult,<br />int maxResults);<br /><br />// 使用指定的实体及属性检索（满足除主键外属性＝实体值）数据<br />public List&lt;T&gt; findEqualByEntity(T entity, String[] propertyNames);<br /><br />// 使用指定的实体及属性(非主键)检索（满足属性 like 串实体值）数据<br />public List&lt;T&gt; findLikeByEntity(T entity, String[] propertyNames);<br /><br />// 使用指定的检索标准检索数据，返回指定范围的记录<br />public Integer getRowCount(DetachedCriteria criteria);<br /><br />// 使用指定的检索标准检索数据，返回指定统计值<br />public Object getStatValue(DetachedCriteria criteria, String propertyName,<br />String StatName);<br /><br />// -------------------------------- Others --------------------------------<br /><br />// 加锁指定的实体<br />public void lock(T entity, LockMode lockMode);<br /><br />// 强制初始化指定的实体<br />public void initialize(Object proxy);<br /><br />// 强制立即更新缓冲数据到数据库（否则仅在事务提交时才更新）<br />public void flush();<br /><br />}<br /><br />实现GenericDao接口的Hibernate的实现类 GenericHibernateDao<br /><br />package com.th.huz;<br /><br />import java.io.Serializable;<br />import java.lang.reflect.ParameterizedType;<br />import java.lang.reflect.Type;<br />import java.util.Collection;<br />import java.util.Iterator;<br />import java.util.List;<br />import org.apache.commons.beanutils.PropertyUtils;<br />import org.hibernate.Criteria;<br />import org.hibernate.LockMode;<br />import org.hibernate.criterion.DetachedCriteria;<br />import org.hibernate.criterion.Example;<br />import org.hibernate.criterion.MatchMode;<br />import org.hibernate.criterion.Order;<br />import org.hibernate.criterion.Projections;<br />import org.hibernate.criterion.Restrictions;<br />import org.springframework.orm.hibernate3.support.HibernateDaoSupport;<br /><br /><br />@SuppressWarnings("unchecked")<br />public class GenericHibernateDao&lt;T extends Serializable, PK extends Serializable&gt;<br />extends HibernateDaoSupport implements GenericDao&lt;T, PK&gt; {<br />// 实体类类型(由构造方法自动赋值)<br />private Class&lt;T&gt; entityClass;<br /><br />// 构造方法，根据实例类自动获取实体类类型<br />public GenericHibernateDao() {<br />this.entityClass = null;<br />Class c = getClass();<br />Type t = c.getGenericSuperclass();<br />if (t instanceof ParameterizedType) {<br />Type[] p = ((ParameterizedType) t).getActualTypeArguments();<br />this.entityClass = (Class&lt;T&gt;) p[0];<br />}<br />}<br /><br />// -------------------- 基本检索、增加、修改、删除操作 --------------------<br /><br />// 根据主键获取实体。如果没有相应的实体，返回 null。<br />public T get(PK id) {<br />return (T) getHibernateTemplate().get(entityClass, id);<br />}<br /><br />// 根据主键获取实体并加锁。如果没有相应的实体，返回 null。<br />public T getWithLock(PK id, LockMode lock) {<br />T t = (T) getHibernateTemplate().get(entityClass, id, lock);<br />if (t != null) {<br />this.flush(); // 立即刷新，否则锁不会生效。<br />}<br />return t;<br />}<br /><br />// 根据主键获取实体。如果没有相应的实体，抛出异常。<br />public T load(PK id) {<br />return (T) getHibernateTemplate().load(entityClass, id);<br />}<br /><br />// 根据主键获取实体并加锁。如果没有相应的实体，抛出异常。<br />public T loadWithLock(PK id, LockMode lock) {<br />T t = (T) getHibernateTemplate().load(entityClass, id, lock);<br />if (t != null) {<br />this.flush(); // 立即刷新，否则锁不会生效。<br />}<br />return t;<br />}<br /><br />// 获取全部实体。<br />public List&lt;T&gt; loadAll() {<br />return (List&lt;T&gt;) getHibernateTemplate().loadAll(entityClass);<br />}<br /><br />// loadAllWithLock() ?<br /><br />// 更新实体<br />public void update(T entity) {<br />getHibernateTemplate().update(entity);<br />}<br /><br />// 更新实体并加锁<br />public void updateWithLock(T entity, LockMode lock) {<br />getHibernateTemplate().update(entity, lock);<br />this.flush(); // 立即刷新，否则锁不会生效。<br />}<br /><br />// 存储实体到数据库<br />public void save(T entity) {<br />getHibernateTemplate().save(entity);<br />}<br /><br />// saveWithLock()？<br /><br />// 增加或更新实体<br />public void saveOrUpdate(T entity) {<br />getHibernateTemplate().saveOrUpdate(entity);<br />}<br /><br />// 增加或更新集合中的全部实体<br />public void saveOrUpdateAll(Collection&lt;T&gt; entities) {<br />getHibernateTemplate().saveOrUpdateAll(entities);<br />}<br /><br />// 删除指定的实体<br />public void delete(T entity) {<br />getHibernateTemplate().delete(entity);<br />}<br /><br />// 加锁并删除指定的实体<br />public void deleteWithLock(T entity, LockMode lock) {<br />getHibernateTemplate().delete(entity, lock);<br />this.flush(); // 立即刷新，否则锁不会生效。<br />}<br /><br />// 根据主键删除指定实体<br />public void deleteByKey(PK id) {<br />this.delete(this.load(id));<br />}<br /><br />// 根据主键加锁并删除指定的实体<br />public void deleteByKeyWithLock(PK id, LockMode lock) {<br />this.deleteWithLock(this.load(id), lock);<br />}<br /><br />// 删除集合中的全部实体<br />public void deleteAll(Collection&lt;T&gt; entities) {<br />getHibernateTemplate().deleteAll(entities);<br />}<br /><br />// -------------------- HSQL ----------------------------------------------<br /><br />// 使用HSQL语句直接增加、更新、删除实体<br />public int bulkUpdate(String queryString) {<br />return getHibernateTemplate().bulkUpdate(queryString);<br />}<br /><br />// 使用带参数的HSQL语句增加、更新、删除实体<br />public int bulkUpdate(String queryString, Object[] values) {<br />return getHibernateTemplate().bulkUpdate(queryString, values);<br />}<br /><br />// 使用HSQL语句检索数据<br />public List find(String queryString) {<br />return getHibernateTemplate().find(queryString);<br />}<br /><br />// 使用带参数的HSQL语句检索数据<br />public List find(String queryString, Object[] values) {<br />return getHibernateTemplate().find(queryString, values);<br />}<br /><br />// 使用带命名的参数的HSQL语句检索数据<br />public List findByNamedParam(String queryString, String[] paramNames,<br />Object[] values) {<br />return getHibernateTemplate().findByNamedParam(queryString, paramNames,<br />values);<br />}<br /><br />// 使用命名的HSQL语句检索数据<br />public List findByNamedQuery(String queryName) {<br />return getHibernateTemplate().findByNamedQuery(queryName);<br />}<br /><br />// 使用带参数的命名HSQL语句检索数据<br />public List findByNamedQuery(String queryName, Object[] values) {<br />return getHibernateTemplate().findByNamedQuery(queryName, values);<br />}<br /><br />// 使用带命名参数的命名HSQL语句检索数据<br />public List findByNamedQueryAndNamed<wbr>Param(String queryName,<br />String[] paramNames, Object[] values) {<br />return getHibernateTemplate().findByNamedQueryAndNamed<wbr>Param(queryName,<br />paramNames, values);<br />}<br /><br />// 使用HSQL语句检索数据，返回 Iterator<br />public Iterator iterate(String queryString) {<br />return getHibernateTemplate().iterate(queryString);<br />}<br /><br />// 使用带参数HSQL语句检索数据，返回 Iterator<br />public Iterator iterate(String queryString, Object[] values) {<br />return getHibernateTemplate().iterate(queryString, values);<br />}<br /><br />// 关闭检索返回的 Iterator<br />public void closeIterator(Iterator it) {<br />getHibernateTemplate().closeIterator(it);<br />}<br /><br />// -------------------------------- Criteria ------------------------------<br /><br />// 创建与会话无关的检索标准<br />public DetachedCriteria createDetachedCriteria() {<br />return DetachedCriteria.forClass(this.entityClass);<br />}<br /><br />// 创建与会话绑定的检索标准<br />public Criteria createCriteria() {<br />return this.createDetachedCriteria().getExecutableCriteria(<br />this.getSession());<br />}<br /><br />// 检索满足标准的数据<br />public List findByCriteria(DetachedCriteria criteria) {<br />return getHibernateTemplate().findByCriteria(criteria);<br />}<br /><br />// 检索满足标准的数据，返回指定范围的记录<br />public List findByCriteria(DetachedCriteria criteria, int firstResult,<br />int maxResults) {<br />return getHibernateTemplate().findByCriteria(criteria, firstResult,<br />maxResults);<br />}<br /><br />// 使用指定的实体及属性检索（满足除主键外属性＝实体值）数据<br />public List&lt;T&gt; findEqualByEntity(T entity, String[] propertyNames) {<br />Criteria criteria = this.createCriteria();<br />Example exam = Example.create(entity);<br />exam.excludeZeroes();<br />String[] defPropertys = getSessionFactory().getClassMetadata(<br />entityClass).getPropertyNames();<br />for (String defProperty : defPropertys) {<br />int ii = 0;<br />for (ii = 0; ii &lt; propertyNames.length; ++ii) {<br />if (defProperty.equals(propertyNames[ii])) {<br />criteria.addOrder(Order.asc(defProperty));<br />break;<br />}<br />}<br />if (ii == propertyNames.length) {<br />exam.excludeProperty(defProperty);<br />}<br />}<br />criteria.add(exam);<br />return (List&lt;T&gt;) criteria.list();<br />}<br /><br />// 使用指定的实体及属性检索（满足属性 like 串实体值）数据<br />public List&lt;T&gt; findLikeByEntity(T entity, String[] propertyNames) {<br />Criteria criteria = this.createCriteria();<br />for (String property : propertyNames) {<br />try {<br />Object value = PropertyUtils.getProperty(entity, property);<br />if (value instanceof String) {<br />criteria.add(Restrictions.like(property, (String) value,<br />MatchMode.ANYWHERE));<br />criteria.addOrder(Order.asc(property));<br />} else {<br />criteria.add(Restrictions.eq(property, value));<br />criteria.addOrder(Order.asc(property));<br />}<br />} catch (Exception ex) {<br />// 忽略无效的检索参考数据。<br />}<br />}<br />return (List&lt;T&gt;) criteria.list();<br />}<br /><br />// 使用指定的检索标准获取满足标准的记录数<br />public Integer getRowCount(DetachedCriteria criteria) {<br />criteria.setProjection(Projections.rowCount());<br />List list = this.findByCriteria(criteria, 0, 1);<br />return (Integer) list.get(0);<br />}<br /><br />// 使用指定的检索标准检索数据，返回指定统计值(max,min,avg,sum)<br />public Object getStatValue(DetachedCriteria criteria, String propertyName,<br />String StatName) {<br />if (StatName.toLowerCase().equals("max"))<br />criteria.setProjection(Projections.max(propertyName));<br />else if (StatName.toLowerCase().equals("min"))<br />criteria.setProjection(Projections.min(propertyName));<br />else if (StatName.toLowerCase().equals("avg"))<br />criteria.setProjection(Projections.avg(propertyName));<br />else if (StatName.toLowerCase().equals("sum"))<br />criteria.setProjection(Projections.sum(propertyName));<br />else<br />return null;<br />List list = this.findByCriteria(criteria, 0, 1);<br />return list.get(0);<br />}<br /><br />// -------------------------------- Others --------------------------------<br /><br />// 加锁指定的实体<br />public void lock(T entity, LockMode lock) {<br />getHibernateTemplate().lock(entity, lock);<br />}<br /><br />// 强制初始化指定的实体<br />public void initialize(Object proxy) {<br />getHibernateTemplate().initialize(proxy);<br />}<br /><br />// 强制立即更新缓冲数据到数据库（否则仅在事务提交时才更新）<br />public void flush() {<br />getHibernateTemplate().flush();<br />}<br />}<br />//以上代码来自网上收集<br /><br /><br />以上就实现了泛型的 Hibernate Dao 了，下面的例子就是业务对象对 GenericHibernateDao的使用<br /><br />业务对象 Article 对应文章表的 aticle 表<br /><br />package com.th.huz.model;<br /><br />import java.io.Serializable;<br />import java.util.Date;<br /><br />public class Article implements Serializable {<br /><br />private static final long serialVersionUID = 1072812006693587010L;<br /><br />private long id;<br />private String title;<br />private String author;<br />private Date pubDate;<br />private String content;<br /><br />public long getId() {<br />return id;<br />}<br /><br />public void setId(long id) {<br />this.id = id;<br />}<br /><br />public String getTitle() {<br />return title;<br />}<br /><br />public void setTitle(String title) {<br />this.title = title;<br />}<br /><br />public String getAuthor() {<br />return author;<br />}<br /><br />public void setAuthor(String author) {<br />this.author = author;<br />}<br /><br />public Date getPubDate() {<br />return pubDate;<br />}<br /><br />public void setPubDate(Date pubDate) {<br />this.pubDate = pubDate;<br />}<br /><br />public String getContent() {<br />return content;<br />}<br /><br />public void setContent(String content) {<br />this.content = content;<br />}<br />}<br /><br /><br /><br /><br />定义 Article 业务对象的Dao 接口 IArticleDao ，它继承自 GenericDao 接口，以获得其中的方法<br /><br />你可以在 IArticleDao 中添加 Article 业务对象特有的方法，也可以直接使用 GenericDao 中提供的所有方法IArticleDao接口指定业务对象的类型和主键的类型 &lt;Article,Long&gt;<br /><br />package com.th.huz.model;<br /><br />import com.th.huz.dao.GenericDao;<br />import com.th.huz.model.Article;<br />public interface IArticleDAO extends GenericDao &lt;Article,Long&gt; {<br />// public void findById(Long id);<br />}<br />然后就可以定义 ArticleHibernateDao 类了，它只要实现 IArticleDao 接口并继承 GenericHibernateDao 类 就可以使用所有的 Generic 接口和 IArticleDao 接口中的定义的方法。如果你在 IArticleDao 接口里指定了Article业务对象特有的方法，就在ArticleHibernateDao实现这些方法。而Generic 接口中的方法，在ArticleHibernateDao 的父类 GenericHibernateDao 中已经全部实现了，直接调用就可以方便的访问数据库。<br /><br />package com.th.huz.model;<br /><br />import com.th.huz.dao.GenericHibernateDao;<br /><br />public class ArticleHibernateDao extends GenericHibernateDao&lt;Article,Long&gt; implements<br />IArticleDAO {<br /><br />}<br />其他的业务对象也可以参照 Article 和 ArticleHibernateDao 类来定义 ， GenericDao 接口中有的通用方法就直接调用，不足的以后补充，其他业务对象特有的方法就 在其他业务对象的 Dao接口(继承GenericDao接口) 中定义并通过 GenericHibernateDao 子类来实现。 节省很多重复代码，简单几步就可以使用GenericDao接口的实现类 GenericHibernateDao 方便地访问数据库。<br /><br />最后提供一个 Article 业务对象的 Hibernate 映射文件 和 建表SQL脚本 和 一个 ArticleHibernateDao 类的测试类<br /><br />Article的映射文件<br /><br />&lt;?xml version="1.0"?&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;!-- Article.hbm.xml --&gt;<br />&lt;hibernate-mapping&gt;<br />&lt;class name="com.th.huz.model.Article" table="article"&gt;<br />&lt;id name="id" type="java.lang.Long"&gt;<br />&lt;column name="id" /&gt;<br />&lt;generator class="native" /&gt;<br />&lt;/id&gt;<br />&lt;property name="title" type="java.lang.String"&gt;<br />&lt;column name="title" length="100" /&gt;<br />&lt;/property&gt;<br />&lt;property name="author"&gt;<br />&lt;column name="author" length="32" /&gt;<br />&lt;/property&gt;<br />&lt;property name="pubDate" type="java.util.Date"&gt;<br />&lt;column name="pubDate" /&gt;<br />&lt;/property&gt;<br />&lt;property name="content" type="java.lang.String"&gt;<br />&lt;column name="content" /&gt;<br />&lt;/property&gt;<br />&lt;/class&gt;<br />&lt;/hibernate-mapping&gt;<br />Article对应的article表的建表脚本<br /><br />if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[article]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)<br />drop table [dbo].[article]<br />GO<br /><br />CREATE TABLE [dbo].[article] (<br />[id] [int] IDENTITY (1, 1) NOT NULL ,<br />[title] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,<br />[author] [varchar] (32) COLLATE Chinese_PRC_CI_AS NULL ,<br />[pubDate] [datetime] NULL ,<br />[content] [text] COLLATE Chinese_PRC_CI_AS NULL<br />) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]<br />GO<br />ArticleHibernateDao的测试类，只提供了seve(article) 方法的测试代码<br /><br />package com.th.huz.test;<br /><br />import junit.framework.TestCase;<br /><br />import org.springframework.context.ApplicationContext;<br />import org.springframework.context.support.ClassPathXmlApplicationC<wbr>ontext;<br /><br />import com.th.huz.model.Article;<br />import com.th.huz.model.ArticleHibernateDao;<br /><br />public class ArticleHibernateDaoTest extends TestCase {<br /><br />ApplicationContext ctx = new ClassPathXmlApplicationC<wbr>ontext(<br />"applicationContext.xml");<br />ArticleHibernateDao adh = (ArticleHibernateDao) ctx<br />.getBean("articleHibernateDao");<br /><br />public void testSave() {<br />Article art = (Article) ctx.getBean("article");<br />art.setId(1);<br />art.setTitle("标题1");<br />art.setAuthor("作者1");<br />adh.save(art);<br />}<br />}</span><img src ="http://www.blogjava.net/stevenjohn/aggbug/372320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-20 22:20 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/20/372320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate一级缓存和二级缓存的区别</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371691.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 11 Mar 2012 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371691.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/371691.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/371691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/371691.html</trackback:ping><description><![CDATA[<span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"> 
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp; &nbsp;缓存是介于应用程序和物理数据源之间，其作用是为了降低应用程序对物理数据源访问的频次，从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制，应用程序在运行时从缓存读写数据，在特定的时刻或事件会同步缓存和物理数据源的数据。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　缓存的介质一般是内存，所以读写速度很快。但如果缓存中存放的数据量非常大时，也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质，还要考虑到管理缓存的并发访问和缓存数据的生命周期。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　Hibernate的缓存包括Session的缓存和SessionFactory的缓存，其中SessionFactory的缓存又可以分为两类：内置缓存和外置缓存。Session的缓存是内置的，不能被卸载，也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似，前者是SessionFactory对象的一些集合属性包含的数据，后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句，映射元数据是映射文件中数据的拷贝，而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来，SessionFactory的内置缓存是只读的，应用程序不能修改缓存中的映射元数据和预定义SQL语句，因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下，SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝，外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　Hibernate的这两级缓存都位于持久化层，存放的都是数据库数据的拷贝，那么它们之间的区别是什么呢？为了理解二者的区别，需要深入理解持久化层的缓存的两个特性：缓存的范围和缓存的并发访问策略。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　持久化层的缓存的范围</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围分为三类。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　1 事务范围：缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期，当事务结束时，缓存也就结束生命周期。在此范围下，缓存的介质是内存。事务可以是数据库事务或者应用事务，每个事务都有独自的缓存，缓存内的数据通常采用相互关联的的对象形式。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　2 进程范围：缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存，因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期，进程结束时，缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据，所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。松散的对象数据形式有点类似于对象的序列化数据，但是对象分解为松散的算法比对象序列化的算法要求更快。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　3 集群范围：在集群环境中，缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点，进程间通过远程通信来保证缓存中的数据的一致性，缓存中的数据通常采用对象的松散数据形式。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　对大多数应用来说，应该慎重地考虑是否需要使用集群范围的缓存，因为访问的速度不一定会比直接访问数据库数据的速度快多少。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据，还可以到进程范围或集群范围的缓存内查询，如果还是没有查到，那么只有到数据库中查询。事务范围的缓存是持久化层的第一级缓存，通常它是必需的；进程范围或集群范围的缓存是持久化层的第二级缓存，通常是可选的。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　持久化层的缓存的并发访问策略</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　当多个并发的事务同时访问持久化层的缓存的相同数据时，会引起并发问题，必须采用必要的事务隔离措施。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　在进程范围或集群范围的缓存，即第二级缓存，会出现并发问题。因此可以设定以下四种类型的并发访问策略，每一种策略对应一种事务隔离级别。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　事务型：仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据，可以采用这种隔离类型，因为它可以防止脏读和不可重复读这类的并发问题。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　读写型：提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。对于经常被读但很少修改的数据，可以采用这种隔离类型，因为它可以防止脏读这类的并发问题。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　非严格读写型：不保证缓存与数据库中数据的一致性。如果存在两个事务同时访问缓存中相同数据的可能，必须为该数据配置一个很短的数据过期时间，从而尽量避免脏读。对于极少被修改，并且允许偶尔脏读的数据，可以采用这种并发访问策略。 　　只读型：对于从来不会修改的数据，如参考数据，可以使用这种并发访问策略。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　事务型并发访问策略是事务隔离级别最高，只读型的隔离级别最低。事务隔离级别越高，并发性能就越低。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　什么样的数据适合存放到第二级缓存中？</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　1、很少被修改的数据</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　2、不是很重要的数据，允许出现偶尔并发的数据</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　3、不会被并发访问的数据</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　4、参考数据</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　不适合存放到第二级缓存的数据？</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　1、经常被修改的数据</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　2、财务数据，绝对不允许出现并发</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　3、与其他应用共享的数据。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　Hibernate的二级缓存</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　如前所述，Hibernate提供了两级缓存，第一级是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务，因此它的缓存是事务范围的缓存。第一级缓存是必需的，不允许而且事实上也无法比卸除。在第一级缓存中，持久化类的每个实例都具有唯一的OID。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　第二级缓存是一个可插拔的的缓存插件，它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应，因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题，因此需要采用适当的并发访问策略，该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把具体的缓存实现软件与Hibernate集成。第二级缓存是可选的，可以在每个类或每个集合的粒度上配置第二级缓存。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　Hibernate的二级缓存策略的一般过程如下：</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　1) 条件查询的时候，总是发出一条select * from table_name where &#8230;. （选择所有字段）这样的SQL语句查询数据库，一次获得所有的数据对象。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　2) 把获得的所有数据对象根据ID放入到第二级缓存中。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　3) 当Hibernate根据ID访问数据对象的时候，首先从Session一级缓存中查；查不到，如果配置了二级缓存，那么从二级缓存中查；查不到，再查询数据库，把结果按照ID放入到缓存。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　4) 删除、更新、增加数据的时候，同时更新缓存。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　Hibernate的二级缓存策略，是针对于ID查询的缓存策略，对于条件查询则毫无作用。为此，Hibernate提供了针对条件查询的Query缓存。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　Hibernate的Query缓存策略的过程如下：</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　1) Hibernate首先根据这些信息组成一个Query Key，Query Key包括条件查询的请求一般信息：SQL, SQL需要的参数，记录范围（起始位置rowStart，最大记录个数maxRows)，等。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　2) Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在，那么返回这个结果列表；如果不存在，查询数据库，获取结果列表，把整个结果列表根据Query Key放入到Query缓存中。</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">　　3) Query Key中的SQL涉及到一些表名，如果这些表的任何数据发生修改、删除、增加等操作，这些相关的Query Key都要从缓存中清空。</p></span><img src ="http://www.blogjava.net/stevenjohn/aggbug/371691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-11 22:25 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/11/371691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate级联保存和更新</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371677.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 11 Mar 2012 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371677.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/371677.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/371677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/371677.html</trackback:ping><description><![CDATA[来源：http://www.tianxiaboke.com/u/lyeerwy<br />
<p><strong><font color="#ff0000">级联保存和更新</font></strong><br />当Hibernate持久化一个临时对象时，在默认情下，他不会自动持久化所关联的其他临时对象，如果希望当持久化对象时把他所关联的所有临时对象进行持久化的话：可以把&nbsp;<many-to-one></many-to-one>的cascade属性设置为"save-update"&nbsp;,cascade的默认属性值为none。<br />cascade:设置操作对象时的级联操作，即层级之间的连锁操作<br />值&nbsp;save-update&nbsp;：表示当保存和更新当前对象(即insert和update语句时)，会级联保存和更新与他关联的对象<br />值&nbsp;all&nbsp;：表示任何情况下都会进行级联操作，即对一个对象进行操作，也会对和他关联的其他对象进行同样的操作<br />值&nbsp;delete&nbsp;：表示在执行delete时，进行级联操作，删除和他关联的对象<br />值&nbsp;none&nbsp;：表示任何情况下，都不会进行级联操作<br /><strong><font color="#0000ff">&lt;set&gt;元素的inverse属性</font></strong></p>
<p>在运行上面的程序时，如果hibernate的"show-sql"设置为true时，就会看到Hibernate会生成很多sql语句，其实很多sql语句都是重复的<br />eg：&nbsp;<br />insert&nbsp;into&nbsp;&nbsp;test.order(o_name,c_id)values(?,?)<br />insert&nbsp;into&nbsp;&nbsp;test.order(o_name,c_id)values(?,?)<br />insert&nbsp;into&nbsp;&nbsp;test&nbsp;order&nbsp;&nbsp;&nbsp;set&nbsp;c_id=?&nbsp;where&nbsp;id=?<br />insert&nbsp;into&nbsp;&nbsp;test&nbsp;order&nbsp;&nbsp;&nbsp;set&nbsp;c_id=?&nbsp;where&nbsp;id=?</p>
<p>为了解决这个问题，我们可以利用在&lt;set&gt;标签中加上inverse属性。术语：inverse是指反转的意思，在 Hibernate中，表示关联关系中的方向关联关系中，inverse="false"的主控方，由主动方负责维护对象关系我们&nbsp;在customer对象的对象配置文件中加上</p>
<p>&lt;set&nbsp;name="orders"&nbsp;&nbsp;cascade="save-update"&nbsp;inverse="true"&gt;<br />&lt;key&nbsp;&nbsp;column="c_id"&nbsp;&gt;&nbsp;&lt;/key&gt;<br />&lt;one-to-many&nbsp;class="net.mbs.mypack.Order&nbsp;"&nbsp;/&gt;<br />&lt;/set&gt;</p>
<p>声明在Customer和Order的双向关联关系中，Customer端的关联只是Order端关联的镜象（即Order端是主空端，负责维护 Customer和order对象之间的关联关系），当hibernate探测到持久化对象Customer或Order的状态发生变化时(主要是关联关系的改变),仅按照Order对象的状态的变化来同步更新数据库。<br />按次配置，如果在程序中，我们仅仅使用Customer.getOrder().add(order)（涉及了和Order的关联关系的改变），是不能让数据库跟对象的变化来进行数据库同步更新的，只有利用Order对象的方法改变的Order对象状态 (eg：order.setCustomer(customer)----涉及到了和Customer的关联关系的改变)时，数据库才会根据变化来同步更新数据库，即只有主控方的状态（涉及到了和另一方面的关联关系的改变）发生了变化后，才会触发对象和数据库的同步更新。</p>
<p><strong><font color="#0000ff">映射一对多双向关联关系<br /></font></strong>当类与类之间建立了关联，就可以方便的从一个对象导航到另一个对象或一组与他关联的对象当中，根据上面的程序，对于一个给定的Order对象，如果想获取与他关联的Customer对象，我们只需要调用入下方法：<br />Customer&nbsp;c=order.geCustomer();&nbsp;那么当我们得到一个Customer对象后，想查出和这个Customer对象关联的所有Order对象时，应该怎么办呢？由于在Customer中没有建立对Order对象的关联，所以，不能通过加载Customer对象来自动加载和他关联的所有Order对象，唯一的方法只能通过JDBC或SQL语言人工写出代码来查询数据库Order表来返回所需要的信息<br />上面的问题虽然解决，但不能算是最好，因为这样性能会有所下降，对象位于内存中，在内存中从一个对象导航到另一个对象显然比到数据库中查询数据要快得多<br /></p>
<p>具体实现&lt;br&gt;<br />1：由于Customer和Order是一对多，即一个Customer要对应多个Order，所以在Customer中应该建立一个Set对象，用于存放和本Customer对象关联的所有Order对象。<br />2：在customer.hbm.xml通过&lt;one-to-many&gt;建立对Order表的关联关系<br />注意：&lt;one-to-many&gt;应该放置在&lt;set&gt;标签中&nbsp;<br />我们先来看看Customer类的设计和customer.hbm.xml文件的内容<br />&lt;br&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------<br /><font color="#0000ff">Customer&nbsp;Order&nbsp;双向一对多</font><br />1：Customer类中建立一个容器对象，包含关联的所有Order对象<br />2：Order类中建立一个Customer对象，关联Customer<br />inverse="true"表示将维护关联的权利交给引起Hibernate语句的生成</p>
<p>customer.getOrders().add(order);<br />customer.setName("dddddd");<br /><br />inverse="true"（设置此属性的一方----是被控方）<br />当主控方修改对象之间的关联关系时，让Hibernate生成sql语句</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/371677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-11 16:36 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/11/371677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5个最常问的几个Hibernate面试问题</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371676.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 11 Mar 2012 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371676.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/371676.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/371676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/371676.html</trackback:ping><description><![CDATA[&nbsp; 5个最常问的几个Hibernate面试问题，不一定你都能回答： <br /><br />1.实体对象在Hibernate中如何进行状态迁移？ <br />2.何谓Hibernate的N+1问题，如何解决？ <br />3.Hibernate延迟加载的机制是什么，如何工作？ <br />4.Hibernate级联保存要如何做？ <br />5.Hibernate的二级缓存和一级缓存有什么区别？ <br /> <img src ="http://www.blogjava.net/stevenjohn/aggbug/371676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-11 15:34 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/11/371676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate延迟加载机制</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371675.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 11 Mar 2012 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371675.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/371675.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/11/371675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/371675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/371675.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt">
<p>延迟加载：</p>
<p>&nbsp;&nbsp; 延迟加载机制是为了避免一些无谓的性能开销而提出来的，所谓延迟加载就是当在真正需要数据的时候，才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载，另外在Hibernate3中还提供了对属性的延迟加载。下面我们就分别介绍这些种类的延迟加载的细节。</p>
<p>A、实体对象的延迟加载：</p>
<p>如果想对实体对象使用延迟加载，必须要在实体的映射配置文件中进行相应的配置，如下所示：</p>
<p>&lt;hibernate-mapping&gt;</p>
<p>&lt;class name=&#8221;com.neusoft.entity.User&#8221; table=&#8221;user&#8221; lazy=&#8221;true&#8221;&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &#8230;&#8230;</p>
<p>&lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p>通过将class的lazy属性设置为true，来开启实体的延迟加载特性。如果我们运行下面的代码：</p>
<p>User user=(User)session.load(User.class,&#8221;1&#8221;);（1）</p>
<p>System.out.println(user.getName());（2）</p>
<p>当运行到(1)处时，Hibernate并没有发起对数据的查询，如果我们此时通过一些调试工具(比如JBuilder2005的Debug工具)，观察此时user对象的内存快照，我们会惊奇的发现，此时返回的可能是User$EnhancerByCGLIB$$bede8986类型的对象，而且其属性为 null,这是怎么回事？还记得前面我曾讲过session.load()方法，会返回实体对象的代理类对象，这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象，并且在代理类对象中包含目标对象的所有属性和方法，而且所有属性均被赋值为null。通过调试器显示的内存快照，我们可以看出此时真正的User对象，是包含在代理对象的 CGLIB$CALBACK_0.target属性中，当代码运行到（2）处时，此时调用user.getName()方法，这时通过CGLIB赋予的回调机制，实际上调用CGLIB$CALBACK_0.getName()方法，当调用该方法时，Hibernate会首先检查 CGLIB$CALBACK_0.target属性是否为null，如果不为空，则调用目标对象的getName方法，如果为空，则会发起数据库查询，生成类似这样的SQL语句：select * from user where id=&#8217;1&#8217;;来查询数据，并构造目标对象，并且将它赋值到CGLIB$CALBACK_0.target属性中。</p>
<p>&nbsp;&nbsp;&nbsp; 这样，通过一个中间代理对象，Hibernate实现了实体的延迟加载，只有当用户真正发起获得实体对象属性的动作时，才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的，所以只有session.load()方法才会利用实体延迟加载，因为只有session.load()方法才会返回实体类的代理类对象。</p>
<p>B、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;集合类型的延迟加载：</p>
<p>在Hibernate的延迟加载机制中，针对集合类型的应用，意义是最为重大的，因为这有可能使性能得到大幅度的提高，为此Hibernate进行了大量的努力，其中包括对JDK Collection的独立实现，我们在一对多关联中，定义的用来容纳关联对象的Set集合，并不是java.util.Set类型或其子类型，而是 net.sf.hibernate.collection.Set类型，通过使用自定义集合类的实现，Hibernate实现了集合类型的延迟加载。为了对集合类型使用延迟加载，我们必须如下配置我们的实体类的关于关联的部分：</p>
<p>&lt;hibernate-mapping&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;class name=&#8221;com.neusoft.entity.User&#8221; table=&#8221;user&#8221;&gt;</p>
<p>&#8230;..</p>
<p>&lt;set name=&#8221;addresses&#8221; table=&#8221;address&#8221; lazy=&#8221;true&#8221; inverse=&#8221;true&#8221;&gt;</p>
<p>&lt;key column=&#8221;user_id&#8221;/&gt;</p>
<p>&lt;one-to-many class=&#8221;com.neusoft.entity.Arrderss&#8221;/&gt;</p>
<p>&lt;/set&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p>通过将&lt;set&gt;元素的lazy属性设置为true来开启集合类型的延迟加载特性。我们看下面的代码：</p>
<p>User user=(User)session.load(User.class,&#8221;1&#8221;);</p>
<p>Collection addset=user.getAddresses();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)</p>
<p>Iterator it=addset.iterator();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)</p>
<p>while(it.hasNext()){</p>
<p>Address address=(Address)it.next();</p>
<p>System.out.println(address.getAddress());</p>
<p>}</p>
<p>当程序执行到(1)处时，这时并不会发起对关联数据的查询来加载关联数据，只有运行到(2)处时，真正的数据读取操作才会开始，这时Hibernate会根据缓存中符合条件的数据索引，来查找符合条件的实体对象。</p>
<p>这里我们引入了一个全新的概念&#8212;&#8212;数据索引，下面我们首先将接一下什么是数据索引。在Hibernate中对集合类型进行缓存时，是分两部分进行缓存的，首先缓存集合中所有实体的id列表，然后缓存实体对象，这些实体对象的id列表，就是所谓的数据索引。当查找数据索引时，如果没有找到对应的数据索引，这时就会一条select SQL的执行，获得符合条件的数据，并构造实体对象集合和数据索引，然后返回实体对象的集合，并且将实体对象和数据索引纳入Hibernate的缓存之中。另一方面，如果找到对应的数据索引，则从数据索引中取出id列表，然后根据id在缓存中查找对应的实体，如果找到就从缓存中返回，如果没有找到，在发起select SQL查询。在这里我们看出了另外一个问题，这个问题可能会对性能产生影响，这就是集合类型的缓存策略。如果我们如下配置集合类型：</p>
<p>&lt;hibernate-mapping&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;class name=&#8221;com.neusoft.entity.User&#8221; table=&#8221;user&#8221;&gt;</p>
<p>&#8230;..</p>
<p>&lt;set name=&#8221;addresses&#8221; table=&#8221;address&#8221; lazy=&#8221;true&#8221; inverse=&#8221;true&#8221;&gt;</p>
<p>&lt;cache usage=&#8221;read-only&#8221;/&gt;</p>
<p>&lt;key column=&#8221;user_id&#8221;/&gt;</p>
<p>&lt;one-to-many class=&#8221;com.neusoft.entity.Arrderss&#8221;/&gt;</p>
<p>&lt;/set&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p>这里我们应用了&lt;cache usage=&#8221;read-only&#8221;/&gt;配置，如果采用这种策略来配置集合类型，Hibernate将只会对数据索引进行缓存，而不会对集合中的实体对象进行缓存。如上配置我们运行下面的代码：</p>
<p>User user=(User)session.load(User.class,&#8221;1&#8221;);</p>
<p>Collection addset=user.getAddresses();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>Iterator it=addset.iterator();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>while(it.hasNext()){</p>
<p>Address address=(Address)it.next();</p>
<p>System.out.println(address.getAddress());</p>
<p>}</p>
<p>System.out.println(&#8220;Second query&#8230;&#8230;&#8221;);</p>
<p>User user2=(User)session.load(User.class,&#8221;1&#8221;);</p>
<p>Collection it2=user2.getAddresses();</p>
<p>while(it2.hasNext()){</p>
<p>Address address2=(Address)it2.next();</p>
<p>System.out.println(address2.getAddress());</p>
<p>}</p>
<p>运行这段代码，会得到类似下面的输出：</p>
<p>Select * from user where id=&#8217;1&#8217;;</p>
<p>Select * from address where user_id=&#8217;1&#8217;;</p>
<p>Tianjin</p>
<p>Dalian</p>
<p>Second query&#8230;&#8230;</p>
<p>Select * from address where id=&#8217;1&#8217;;</p>
<p>Select * from address where id=&#8217;2&#8217;;</p>
<p>Tianjin</p>
<p>Dalian</p>
<p>我们看到，当第二次执行查询时，执行了两条对address表的查询操作，为什么会这样？这是因为当第一次加载实体后，根据集合类型缓存策略的配置，只对集合数据索引进行了缓存，而并没有对集合中的实体对象进行缓存，所以在第二次再次加载实体时，Hibernate找到了对应实体的数据索引，但是根据数据索引，却无法在缓存中找到对应的实体，所以Hibernate根据找到的数据索引发起了两条select SQL的查询操作，这里造成了对性能的浪费，怎样才能避免这种情况呢？我们必须对集合类型中的实体也指定缓存策略，所以我们要如下对集合类型进行配置：</p>
<p>&lt;hibernate-mapping&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;class name=&#8221;com.neusoft.entity.User&#8221; table=&#8221;user&#8221;&gt;</p>
<p>&#8230;..</p>
<p>&lt;set name=&#8221;addresses&#8221; table=&#8221;address&#8221; lazy=&#8221;true&#8221; inverse=&#8221;true&#8221;&gt;</p>
<p>&lt;cache usage=&#8221;read-write&#8221;/&gt;</p>
<p>&lt;key column=&#8221;user_id&#8221;/&gt;</p>
<p>&lt;one-to-many class=&#8221;com.neusoft.entity.Arrderss&#8221;/&gt;</p>
<p>&lt;/set&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p>此时Hibernate会对集合类型中的实体也进行缓存，如果根据这个配置再次运行上面的代码，将会得到类似如下的输出：</p>
<p>Select * from user where id=&#8217;1&#8217;;</p>
<p>Select * from address where user_id=&#8217;1&#8217;;</p>
<p>Tianjin</p>
<p>Dalian</p>
<p>Second query&#8230;&#8230;</p>
<p>Tianjin</p>
<p>Dalian</p>
<p>这时将不会再有根据数据索引进行查询的SQL语句，因为此时可以直接从缓存中获得集合类型中存放的实体对象。</p>
<p>C、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;属性延迟加载：</p>
<p>&nbsp;&nbsp; 在Hibernate3中，引入了一种新的特性&#8212;&#8212;属性的延迟加载，这个机制又为获取高性能查询提供了有力的工具。在前面我们讲大数据对象读取时，在 User对象中有一个resume字段，该字段是一个java.sql.Clob类型，包含了用户的简历信息，当我们加载该对象时，我们不得不每一次都要加载这个字段，而不论我们是否真的需要它，而且这种大数据对象的读取本身会带来很大的性能开销。在Hibernate2中，我们只有通过我们前面讲过的面性能的粒度细分，来分解User类，来解决这个问题（请参照那一节的论述），但是在Hibernate3中，我们可以通过属性延迟加载机制，来使我们获得只有当我们真正需要操作这个字段时，才去读取这个字段数据的能力，为此我们必须如下配置我们的实体类：</p>
<p>&lt;hibernate-mapping&gt;</p>
<p>&lt;class name=&#8221;com.neusoft.entity.User&#8221; table=&#8221;user&#8221;&gt;</p>
<p>&#8230;&#8230;</p>
<p>&lt;property name=&#8221;resume&#8221; type=&#8221;java.sql.Clob&#8221; column=&#8221;resume&#8221; lazy=&#8221;true&#8221;/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p>通过对&lt;property&gt;元素的lazy属性设置true来开启属性的延迟加载，在Hibernate3中为了实现属性的延迟加载，使用了类增强器来对实体类的Class文件进行强化处理，通过增强器的增强，将CGLIB的回调机制逻辑，加入实体类，这里我们可以看出属性的延迟加载，还是通过 CGLIB来实现的。CGLIB是Apache的一个开源工程，这个类库可以操纵java类的字节码，根据字节码来动态构造符合要求的类对象。根据上面的配置我们运行下面的代码：</p>
<p>String sql=&#8221;from User user where user.name=&#8217;zx&#8217; &#8221;;</p>
<p>Query query=session.createQuery(sql);&nbsp;&nbsp;&nbsp; (1)</p>
<p>List list=query.list();</p>
<p>for(int i=0;i&lt;list.size();i++){</p>
<p>User user=(User)list.get(i);</p>
<p>System.out.println(user.getName());</p>
<p>System.out.println(user.getResume());&nbsp;&nbsp;&nbsp; (2)</p>
<p>}</p>
<p>当执行到(1)处时，会生成类似如下的SQL语句：</p>
<p>Select id,age,name from user where name=&#8217;zx&#8217;;</p>
<p>这时Hibernate会检索User实体中所有非延迟加载属性对应的字段数据，当执行到(2)处时，会生成类似如下的SQL语句：</p>
<p>Select resume from user where id=&#8217;1&#8217;;</p>
<p>这时会发起对resume字段数据真正的读取操作。</p></div> <img src ="http://www.blogjava.net/stevenjohn/aggbug/371675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-11 15:32 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/11/371675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>