ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美大片免费久久精品三p,国产伦理久久久久久妇女,精品在线小视频http://www.aygfsteel.com/keweibo/category/25071.html一ä¸? Java 多能 Delphi,Powerbuilder ... zh-cnThu, 14 Jul 2011 14:00:20 GMTThu, 14 Jul 2011 14:00:20 GMT60struts2+spring+hibernate 懒加载异常:org.hibernate.LazyInitializationException: failed to lazily initializehttp://www.aygfsteel.com/keweibo/articles/354252.htmlKeKeWed, 13 Jul 2011 05:55:00 GMThttp://www.aygfsteel.com/keweibo/articles/354252.htmlhttp://www.aygfsteel.com/keweibo/comments/354252.htmlhttp://www.aygfsteel.com/keweibo/articles/354252.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/354252.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/354252.html两种处理æ–ÒŽ³•åQ?br />一、在映射文äšg中设¾|®lazy=falseã€?br />二、用OpenSessionInViewFilter˜q‡æ×o器,注意hibernateFilter˜q‡æ×o器和struts2˜q‡æ×o器在映射时的先后™åºåºã€‚同时要配置事物处理åQŒå¦åˆ™ä¼šå¯ÆD‡´session处于只读状态而不能做修改、删除的动作ã€?br />卛_œ¨web.xmlæ–‡äšg中如下配¾|®ï¼š
<!-- OpenSessionInView -->
    <filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
        
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


Ke 2011-07-13 13:55 发表评论
]]>
Oracle 数据库Hibernate 保存带有时分¿U’的日期¾cÕdž‹http://www.aygfsteel.com/keweibo/articles/354166.htmlKeKeTue, 12 Jul 2011 06:50:00 GMThttp://www.aygfsteel.com/keweibo/articles/354166.htmlhttp://www.aygfsteel.com/keweibo/comments/354166.htmlhttp://www.aygfsteel.com/keweibo/articles/354166.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/354166.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/354166.htmlOracle数据库对应表的Column¾cÕdž‹ä¸ºDate
Java¾cÖM¸­å­—æ®µçš„ç±»åž‹äØ“ java.util.Date

<property name="createdDate" type="timestamp" >
            <column name="CREATED_DATE" />
</property>

映射文äšg中property元素的type属性å€égØ“ timestamp .

Ke 2011-07-12 14:50 发表评论
]]>
hibernate 映射自èín一对多双相兌™”http://www.aygfsteel.com/keweibo/articles/353875.htmlKeKeThu, 07 Jul 2011 07:35:00 GMThttp://www.aygfsteel.com/keweibo/articles/353875.htmlhttp://www.aygfsteel.com/keweibo/comments/353875.htmlhttp://www.aygfsteel.com/keweibo/articles/353875.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/353875.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/353875.html映射文äšg
<hibernate-mapping>
    <class name="org.gecs.hibernate.test.AdDepartment" table="AD_DEPARTMENT" schema="BARCODE"
           dynamic-insert="true" dynamic-update="true">
        <id name="adDepartmentId" type="long">
            <column name="AD_DEPARTMENT_ID" precision="22" scale="0" />
            <generator class="sequence">
                <param name="sequence">AD_DEPARTMENT_SEQ</param>
            </generator>
        </id>
        <property name="departmentName" type="string">
            <column name="DEPARTMENT_NAME" length="50" not-null="true" />
        </property>
        <property name="active" type="java.lang.Character" insert="false" update="true">
            <column name="ACTIVE" length="1" />
        </property>
        <property name="createdTime" type="date" insert="false" update="false">
            <column name="CREATED_TIME" length="7" />
        </property>
        <property name="createdUser" type="string">
            <column name="CREATED_USER" length="20" not-null="true" />
        </property>
        
        <many-to-one name="parentDepartment" column="PARENT_DEPARTMENT_ID"/>
        
        <set name="childDepartment" cascade="save-update" lazy="true" inverse="true">
            <key column="PARENT_DEPARTMENT_ID"/>
            <one-to-many class="org.gecs.hibernate.test.AdDepartment"/>
        </set>

    </class>
</hibernate-mapping>

表结构:
‹¹‹è¯•代码åQ?/span>
public void testSave() {
        AdDepartment department = new AdDepartment();
        department.setDepartmentName("華南資訊è™?);
        department.setCreatedUser("bob");
        
        AdDepartment child_department = new AdDepartment();
        child_department.setDepartmentName("PCBA應用¾pȝ®”éƒ?);
        child_department.setCreatedUser("bob");
        child_department.setParentDepartment(department);
        //
        department.getChildDepartment().add(child_department);
        
        Transaction tran = session.beginTransaction();
        session.save(department);
        //session.save(child_department);
        tran.commit();
    }

效果åQ?/span>


Ke 2011-07-07 15:35 发表评论
]]>
hibernate 映射文äšg配置默认值方æ³?/title><link>http://www.aygfsteel.com/keweibo/articles/353872.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Thu, 07 Jul 2011 06:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/353872.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/353872.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/353872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/353872.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/353872.html</trackback:ping><description><![CDATA[<div><p>通过讄¡½®hibernate映射文äšgçš„classå¤?dynamic-insert="true" dynamic-update="true" å’Œproperty 里面的insert="false" update="false" 实现 .<br /></p> <p>两处都要配置åQ?/p> <p><property></property>标签属性:update=”true|false”</p> <p>如果讄¡½®ä¸ºfalse,则在hibernateçš„update语句里面没有<property>标签所指明的属性所对应的字ŒDüc€?/p> <p>同理åQŒinsert=”true|false”</p> <p>如果讄¡½®ä¸ºfalse,则在hibernateçš„insert语句里面没有<property>标签所指明的属性所对应的字ŒDüc€?/p> <p>˜q™æ ·çš„弊端是无法从表单上填写信息了ã€?/p></div><div><hibernate-mapping><br />    <class name="org.gecs.hibernate.test.AdDepartment" table="AD_DEPARTMENT" schema="BARCODE"<br />           <span style="color: red;">dynamic-insert="true" dynamic-update="true"></span><br />        <id name="adDepartmentId" type="long"><br />            <column name="AD_DEPARTMENT_ID" precision="22" scale="0" /><br />            <generator class="sequence"><br />                <param name="sequence">AD_DEPARTMENT_SEQ</param><br />            </generator><br />        </id><br />        <property name="departmentName" type="string"><br />            <column name="DEPARTMENT_NAME" length="50" not-null="true" /><br />        </property><br />        <property name="active" type="java.lang.Character"<span style="color: red;"> insert="false" update="true"></span><br />            <column name="ACTIVE" length="1" /><br />        </property><br />        <property name="createdTime" type="date" <span style="color: red;">insert="false" update="false"></span><br />            <column name="CREATED_TIME" length="7" /><br />        </property><br />        <property name="createdUser" type="string"><br />            <column name="CREATED_USER" length="20" not-null="true" /><br />        </property><br /><br />    </class><br /></hibernate-mapping><br /></div><div><strong style="color: red;">注:insert="false" update="false" 的作用是不对当前字段˜q›è¡Œinsertå’Œupdate操作åQŒè¿™æ ·hibernatež®×ƒ¸ä¼šåœ¨æœªæŒ‡æ˜Žé»˜è®¤åˆ—的情况下ž®†æ•°æ®åº“表中默认值字ŒD‰|¸…½Iºï¼Œä½†åŒæ—¶ä¹Ÿä¼šé€ æˆæ— æ³•å¯ÒŽ­¤å­—段插入或更新非默认倹{€?/strong></div><img src ="http://www.aygfsteel.com/keweibo/aggbug/353872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2011-07-07 14:55 <a href="http://www.aygfsteel.com/keweibo/articles/353872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【图】Hibernate Tools-代码生成åQˆè{åQ?/title><link>http://www.aygfsteel.com/keweibo/articles/353861.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Thu, 07 Jul 2011 03:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/353861.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/353861.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/353861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/353861.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/353861.html</trackback:ping><description><![CDATA[<div><div class="wmqeeuq" id="cnblogs_post_body"><p><strong><span style="color: red;">转自åQ?/span><span style="color: red;">http://www.cnblogs.com/abllyboy/archive/2010/12/23/1914577.html</span></strong><br /></p><p>建立好数据库后,点击一个键åQŒä»£ç å°±ç”Ÿæˆäº†ï¼Œ˜q™å®žåœ¨æ˜¯ä»½ååˆ†æƒ¬æ„çš„事情åQŒå‰é¢æœ‰ä»‹ç»Hibernate Toolsž®±å¯ä»¥ç”Ÿæˆä»£ç ï¼Œé‚£ä¹ˆæˆ‘们怎么利用它来生成代码呢ã€?/p> <p>下面ž®±æŠŠè¯¦ç»†æ­¥éª¤è´´å‡ºæ¥ï¼ŒåŒæ ·åQŒæœ‰å›¾æœ‰çœŸç›¸ã€?/p> <p>Step1åQšå®‰è£…好Hibernate ToolsåQŒå¾ç«‹ä¸€ä¸ªDynamic web project,½W”者工½E‹åä¸?#8220;HibernateTest”</p> <p>Step2åQšç¬”è®îC»¥Mysql为示例,所以安装一个MysqlåQŒå¾ç«‹ç›¸åº”测试数据库及表åQŒä¸‹å›¾äØ“½W”者的数据库及è¡?/p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310170478.jpg" alt="" /></p> <p>Step3åQšå°†MySqlçš„Jdbc驱动拯‚´è‡³lib目录åQŒç¬”者的为mysql-connector-java-5.1.14-bin.jaråQŒå¯ä»¥åŽ»Mysql官网下蝲</p> <p>Step4åQšåˆ©ç”¨Hibernate Tools生成hibernate.cfg.xmlæ–‡äšgåQŒå¦‚下图åQ?/p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310200339.jpg" alt="" height="145" width="586" /></p> <p>点击后可以对hibernate.cfg.xml命ä×oåQŒä¸½Ž¡å®ƒç›´æŽ¥é»˜è®¤è½¬åˆ°ä¸‹ä¸€æ­¥çš„配置界面åQŒç¬”者的配置如下图:</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310245074.jpg" alt="" /></p> <p>点击完成后,它将生成如下xml的配¾|®æ–‡ä»?/p> <p> </p> <div> <div class="wmqeeuq" id="highlighter_760520"><div><div alt1=""><table><tbody><tr><td><code>1</code></td><td><code><?xml version=</code><code>"1.0"</code> <code>encoding=</code><code>"UTF-8"</code><code>?><br><!DOCTYPE hibernate-configuration PUBLIC<br>     </code><code>"-//Hibernate/Hibernate Configuration DTD 3.0//EN"</code><code><br>      </code><code>"<a </code><code>><br><hibernate-configuration><br>    <session-factory><br>        <property name=</code><code>"hibernate.connection.driver_class"</code><code>>com.mysql.jdbc.Driver</property><br>        <property name=</code><code>"hibernate.connection.password"</code><code>></code><code>111</code><code></property><br>        <property name=</code><code>"hibernate.connection.url"</code><code>>jdbc:<a href="mysql://localhost:">mysql://localhost:</a></code><code>3306</code><code>/javadb</property><br>        <property name=</code><code>"hibernate.connection.username"</code><code>>root</property><br>        <property name=</code><code>"hibernate.dialect"</code><code>>org.hibernate.dialect.MySQLDialect</property><br>    </session-factory><br></hibernate-configuration><br></code></td></tr></tbody></table></div></div></div> </div> <p> </p> <p>Step5åQšHibernate Console 配置</p> <p>a.右键工程åQŒç‚¹å‡»Run as-Run Configurations˜q›å…¥å¦‚下界面òq‰™€‰æ‹©Hibernate Console ConfigurationåQ?/p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310343581.jpg" alt="" /></p> <p>b.新徏一个ConfigureåäØ“HibernateConsoleåQŒåå­—可随个人爱好来命名</p> <p>½W”者各标签™åµé…¾|®å¦‚下:</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310382123.jpg" alt="" /></p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310382663.jpg" alt="" /></p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310383147.jpg" alt="" /></p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310383631.jpg" alt="" /></p> <p>Step6:利用Hibernat Tools生成reveng.xml</p> <p>a.工程中右键如下图åQŒæ·»åŠ reveng.xml</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311101564.jpg" alt="" /></p> <p>b.没啥说的命个名,选择攄¡½®ä½ç½®</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311110921.jpg" alt="" /></p> <p>c.按照½Ž­å¤´æ–¹å‘˜q›è¡Œæ“ä½œåQŒé€‰æ‹©console的配¾|®ï¼Œå†ç‚¹å‡Õdˆ·æ–ŽÍ¼Œž®Þpƒ½çœ‹åˆ°æ•°æ®åº“中的表åQŒå°†å®ƒä»¬Include˜q›æ¥åQŒå¦‚下图</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311115895.jpg" alt="" /></p> <p>d:最¾lˆæ•ˆæž?/p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311132939.jpg" alt="" /></p> <p>Step7:˜q™æ˜¯æœ€åŽä¸€æ­¥äº†åQŒæ¿€åЍäh心的时刻ž®Þp¦åˆîCº†</p> <p>a.在Eclipse的工å…äh ä¸­å°†Hibernate Code Generate昄¡¤ºå‡ºæ¥åQŒæ˜¾½Cºå‡ºæ¥åŽç‚¹å‡»Hibernate Code Generate ConfigurationsåQŒå¦‚下图:</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310415767.jpg" alt="" /></p> <p>b.Main标签™åµä¸­é€‰æ‹©æŽ§åˆ¶åŽÍ¼Œé€‰æ‹©æ–‡äšg输出路径åQŒåŒ…名,reveng.xmlæ–‡äšg</p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311143172.jpg" alt="" /></p> <p>c.Exporters标签™åµï¼Œé€‰æ‹©è¦ç”Ÿæˆçš„æ–‡äšgåQŒè®°å¾—勾上Hebernate xml Mappings及Hebernate xml Configuration,它们ž®†è‡ªåŠ¨ç”Ÿæˆæ˜ ž®„æ–‡ä»¶åÆˆæ³¨å†ŒåQ?/p> <p>配置好后åQŒç‚¹å‡»Run卛_¯ç”Ÿæˆä»£ç ã€?/p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311155578.jpg" alt="" /></p> <p> </p> <p>大功告成åQŒæœ€åŽçš„生成的代码结构如下图åQ?/p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122311185116.jpg" alt="" /></p> <p> </p> <p>感谢你的阅读åQŒå¸Œæœ›æœ¬æ–‡å¯¹ä½ æœ‰ç”¨ï¼</p></div></div><img src ="http://www.aygfsteel.com/keweibo/aggbug/353861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2011-07-07 11:54 <a href="http://www.aygfsteel.com/keweibo/articles/353861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate出现javax.naming.NoInitialContextException 错误的解军_Šžæ³?/title><link>http://www.aygfsteel.com/keweibo/articles/353676.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 05 Jul 2011 00:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/353676.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/353676.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/353676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/353676.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/353676.html</trackback:ping><description><![CDATA[异常信息åQ?br /><div>08:02:56,329  WARN SessionFactoryObjectFactory:123 - Could not unbind factory from JNDI<br />javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial<br />    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)<br />    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)<br />    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)<br />    at javax.naming.InitialContext.unbind(InitialContext.java:416)<br />    at org.hibernate.impl.SessionFactoryObjectFactory.removeInstance(SessionFactoryObjectFactory.java:116)<br />    at org.hibernate.impl.SessionFactoryImpl.close(SessionFactoryImpl.java:806)<br />    at org.hibernate.test.junit.UserTest.tearDown(UserTest.java:43)<br />    at junit.framework.TestCase.runBare(TestCase.java:130)<br />    at junit.framework.TestResult$1.protect(TestResult.java:106)<br />    at junit.framework.TestResult.runProtected(TestResult.java:124)<br />    at junit.framework.TestResult.run(TestResult.java:109)<br />    at junit.framework.TestCase.run(TestCase.java:118)<br />    at junit.framework.TestSuite.runTest(TestSuite.java:208)<br />    at junit.framework.TestSuite.run(TestSuite.java:203)<br />    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)<br />    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)<br />    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)<br />    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)<br />    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)<br />    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)</div>å¾ˆå¥‡æ€ªæˆ‘çš„é¡¹ç›®åÆˆæ²¡æœ‰ä½¿ç”¨åˆ°JNDIåQŒä½†æ˜¯å´æŠ›å‡ºJNDIç›¸å…³çš„å¼‚å¸æ€¿¡æ¯ã€?br />原来是Hibernate的配¾|®æ–‡ä»¶hibernate.cfg.xml有问é¢?br /><div><hibernate-configuration><br />    <session-factory <strong>name="foo"</strong>><br />        <property name="hibernate.connection.url">jdbc:oracle:thin:@10.240.144.25:1521:MES</property><br />        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property><br />        <property name="hibernate.connection.username">*****</property><br />        <property name="hibernate.connection.password">*****</property><br />        <property name="dialect">org.hibernate.dialect.OracleDialect</property><br />        <property name="show_sql">true</property><br />        <br />        <mapping resource="org/hibernate/test/User.hbm.xml"/><br />        <br />    </session-factory><br /></hibernate-configuration></div><br />原因åQ?lt;seesion-factory>元素多了属æ€?name.<br /><div><span style="font-family: 宋体;" face="宋体"><span style="font-size: small;" size="3">˜q™æ ·åQŒhibernate会试图把˜q™ä¸ªsessionfacotry注册到JNDI中去</span></span></div><img src ="http://www.aygfsteel.com/keweibo/aggbug/353676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2011-07-05 08:12 <a href="http://www.aygfsteel.com/keweibo/articles/353676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置Middlegen-Hibernateå’Œhibernate-extensions以äñ”生hbm映射文äšgå’ŒPOJO(è½?http://www.aygfsteel.com/keweibo/articles/292609.htmlKeKeWed, 26 Aug 2009 02:50:00 GMThttp://www.aygfsteel.com/keweibo/articles/292609.htmlhttp://www.aygfsteel.com/keweibo/comments/292609.htmlhttp://www.aygfsteel.com/keweibo/articles/292609.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/292609.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/292609.html軟體下載盔R—œåœ°å€åQšhttp://ant.apache.org/bindownload.cgi?Preferred=http%3A%2F%2Fapache.etoak.com

http://sourceforge.net/projects/hibernate/files/

先决条äšgåQ?/font>

已经安装�/span>ant�/span>MySQL数据库,数据库表已经建立�/span>

 

1ã€?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  ä»?/span>Hibernate官方¾|‘站下蝲Middlegen-Hibernateå’?/span>hibernate-extensionsåQŒåƈ解压ã€?/span>

2ã€?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  配置Middlegen-Hibernate:

2.1 配置数据库连�/span>

假设˜qžæŽ¥çš„æ•°æ®åº“æ˜?/span>MySQLåQŒåœ¨Middlegen-Hibernate-r5\config\database目录中有一ä¸?/span>mysql.xmlæ–‡äšgåQŒæ˜¯ç”¨æ¥é…ç½®MySQL数据库的˜qžæŽ¥çš„ã€‚å†…å®¹äØ“åQ?/span>

   <property name="database.script.file" value="${src.dir}/sql/${name}-mysql.sql"/>

   <property name="database.driver.file" value="${lib.dir}/mysql-connector-java-3.0.15-ga-bin.jar"/>

   <property name="database.driver.classpath"      value="${database.driver.file}"/>

   <property name="database.driver"                value="org.gjt.mm.mysql.Driver"/>

   <property name="database.url"                   value="jdbc:mysql://localhost/jboss"/>

   <property name="database.userid"                value="jboss"/>

   <property name="database.password"              value="jboss"/>

   <property name="database.schema"                value=""/>

   <property name="database.catalog"               value=""/>

 

   <property name="jboss.datasource.mapping"       value="mySQL"/>

ž®?/span>mysql-connector-java-3.0.15-ga-bin.jar拯‚´åˆ?/span>${lib.dir}åQŒä¹Ÿž®±æ˜¯Middlegen-Hibernate-r5\lib目录ã€?/span>

修改配置文äšg中的数据库连接项ç›?/span>database.urlã€?/span>database.useridã€?/span>database.userid ä½?/span>Middlegen-Hibernate可以扑ֈ°æ•°æ®åº“ã€?/span>

2.2 配置Middlegen-Hibernate-r5çš?/span>ant˜qè¡Œæ–‡äšgbuild.xml

<!DOCTYPE project [

    <!ENTITY database SYSTEM "file:./config/database/mysql.xml">

]>

指出使用的数据库配置文äšgã€?/font>

<project name="Middlegen Hibernate" default="all" basedir=".">

   <property file="${basedir}/build.properties"/>

   <property name="name" value="hibernatesample"/>

指出你的应用名称�/font>

   <property name="build.gen-src.dir"              value="C:/sample"/>

指出hbmçš„è¾“å‡ø™µ\径ã€?/span>

         <hibernate

            destination="${build.gen-src.dir}"

            package="org.hibernate.sample"

            genXDocletTags="false"

            genIntergratedCompositeKeys="false"

            javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"

         />

指出hbm所在的包的位置�/span>

指出hbm.xml中是否需�/span>XDoclet Tags�/span>

3ã€?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  ˜qè¡ŒMiddlegen-Hibernate:

åœ?/span>Middlegen-Hibernate目录下运è¡?/span>antåQŒè¿›å…?/span>Middlegen-Hibernate的图形界面。可以设¾|®è¡¨åQŒå’Œå­—段的特性。然后按GenarateåQŒäñ”ç”?/span>hbm.xmlæ–‡äšgã€?/span>

4ã€?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  配置hibernate-extensions

åœ?/span>hibernate-extensions-2.1.2\tools\bin目录有一ä¸?/span>setenv.batæ–‡äšgåQŒæ”¹å˜å…¶å†…容为:

set JDBC_DRIVER=C:\java\Middlegen-Hibernate-r5\lib\mysql-connector-java-3.0.15-ga-bin.jar

set HIBERNATE_HOME=C:\java\hibernate-2.1.6

 

set CORELIB=%HIBERNATE_HOME%\lib

set LIB=..\lib

set PROPS=%HIBERNATE_HOME%\src

set CP=%JDBC_DRIVER%;%PROPS%;%HIBERNATE_HOME%\hibernate2.jar;%CORELIB%\commons-logging-1.0.4.jar;%CORELIB%\commons-collections-2.1.1.jar;%CORELIB%\commons-lang-1.0.1.jar;%CORELIB%\cglib-full-2.0.2.jar;%CORELIB%\dom4j-1.4.jar;%CORELIB%\odmg-3.0.jar;%CORELIB%\xml-apis.jar;%CORELIB%\xerces-2.4.0.jar;%CORELIB%\xalan-2.4.0.jar;%LIB%\jdom.jar;%LIB%\..\hibernate-tools.jar

注意¾U¢è‰²å­—体提示的均是èµ\径和JARæ–‡äšg名,一定要正确ã€?/span>

5、运è¡?/span>hibernate-extensionsåQŒæ ¹æ?/span>hbm.xml产生POJOæ–‡äšg

�/span>DOS中运�/span>hbm2java c:\sample\org\hibernate\sample\*.xml --output=c:\sample\

轉自åQšhttp://www.aygfsteel.com/relax/archive/2005/03/01/1588.html



]]>
[转]一个泛型Hibernate DAO实现http://www.aygfsteel.com/keweibo/articles/184372.htmlKeKeThu, 06 Mar 2008 15:17:00 GMThttp://www.aygfsteel.com/keweibo/articles/184372.htmlhttp://www.aygfsteel.com/keweibo/comments/184372.htmlhttp://www.aygfsteel.com/keweibo/articles/184372.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/184372.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/184372.html阅读全文

]]>
多对多关联关¾pȝš„使用http://www.aygfsteel.com/keweibo/articles/171544.htmlKeKeSat, 29 Dec 2007 07:01:00 GMThttp://www.aygfsteel.com/keweibo/articles/171544.htmlhttp://www.aygfsteel.com/keweibo/comments/171544.htmlhttp://www.aygfsteel.com/keweibo/articles/171544.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/171544.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/171544.html  å¤šå¯¹å¤šåªæœ‰åŒå‘å…³¾p»ï¼ˆå¦‚æžœæ·ÕdŠ ä¸€å¼ è¾…åŠ©è¡¨æ¥å­˜å‚¨å¤šå¯¹å¤šçš„å•å‘å…³¾pÖM¹Ÿå¯ä»¥åQŒä½†æ˜¯ä¸å€¼å¾—
˜q™ä¹ˆåšï¼Œå› äؓ多对多的单向关系可以用多对一或者一对多的半向关¾pÀL¥è¡¨è¾¾åQŒä¸å¿…要æ·ÕdР䏀å¼?br /> 辅助表)åQŒå¦‚学生与课½E‹ä¹‹é—ß_¼Œä¸€ä¸ªå­¦ç”Ÿå¯¹åº”多个课½E‹ï¼Œä¸€ä¸ªè¯¾½E‹ä¹Ÿå¯ä»¥è¢«å¤šä¸ªå­¦ç”Ÿé€‰æ‹©ã€?/p>

Student.hbm.xml
...
<hibernate-mapping>
 <class name="model.Student" table="student">
  <id name="id" unsaved-value="null">
   <generator class="uuid.hex"/>
  </id>
  <property name="name" type="string"/>
  <set name="courses"
    table="student_course"
    cascade="save-update"
  >
    <key column="stu_id"/>
    <many-to-many class="model.Course
      column="course_id"/>
  </set>

 <class>
</hibernate-mapping>
多对多关¾p»éœ€è¦é…¾|®çš„å±žæ€§æ¯”è¾ƒå¤šä¸€äº›ã€‚åˆå­¦è€…ç»å¸æ€¼šæŠ?lt;key column=""/>å’?lt;column="">çš„å€?br /> 弄反了,其实只要è®îC½ä¸€ä¸ªåŽŸåˆ™ï¼š<key column="">æ€ÀL˜¯å’Œæœ¬íw«ç±»çš„主键id对应åQŒè€?lt;column="">
æ€ÀL˜¯ä¸Žå…³è”类的主键id相对应。对于上面的Student.hbm.xml,å…Œ™”¾cÀL˜¯Course,本èín¾cÕdˆ™æ˜¯Student

Course.hbm.xml
...
<hibernate-mapping>
 <class name="model.Course" table="course">
  <id name="id" unsaved-value="null">
   <generator class="uuid.hex"/>
  </id>
  <propery name="name" type="string"/>
  <set name="students"
    table="student_course"
    cascade="save-update"
    >
    <key columm="course_id"/>
    <many-to-many class="model.Student"
      column="stu_id"/>
  </set>

 </class>
</hibernate-mapping>
注意åQšStudent与Courseçš„cascade都设¾|®äØ“save-updateåQŒåœ¨å¤šå¯¹å¤šçš„关系中,all,delete½{?br /> cascade是没有意义的åQŒå› ä¸ºå¤šå¯¹å¤šå…³ç³»ä¸­ï¼Œòq¶ä¸èƒ½å› ä¸ºçˆ¶å¯¹è±¡è¢«åˆ é™¤ï¼Œè€Œé€ æˆè¢«åŒ…括的子对è±?br /> è¢«åˆ é™¤ï¼Œå› äØ“å¯èƒ½˜q˜æœ‰å…¶ä»–的父对象参考了˜q™ä¸ªå­å¯¹è±¡ã€?/span>

另外åQŒåœ¨å¤šå¯¹å¤šå…³¾pÖM¸­åQŒå¦‚果双斚wƒ½æœ‰æŽ§åˆ¶æƒåQˆä¹Ÿž®±æ˜¯åŒæ–¹éƒ½æ²¡æœ‰è®¾¾|®inverse="true"åQ‰ï¼Œåˆ?br /> 双方都要把关联关¾pÕdæ˜ åˆ°æ•°æ®åº“。必™åÕdœ¨æŸä¸€æ–¹è®¾¾|®inverse="true"åQŒç„¶åŽåœ¨æ‰§è¡Œè¯­å¥æ—¶ä‹Éç”?br /> ä¸ÀLŽ§æ–¹è¿›è¡Œæ“ä½œï¼ˆä¹Ÿå°±æ˜¯æ²¡æœ‰è®¾¾|®inverse="true"的那一方)ã€?/strong>



]]>
一对多、多对一兌™”关系的ä‹Éç”?/title><link>http://www.aygfsteel.com/keweibo/articles/171520.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 29 Dec 2007 06:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/171520.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/171520.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/171520.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/171520.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/171520.html</trackback:ping><description><![CDATA[<p>  ä¸€å¯¹å¤šå’Œå¤šå¯¹ä¸€å…³ç³»åœ¨å®žé™…生‹zÖM¸­æ˜¯éžå¸¸å¸¸è§çš„。在¾~–写½E‹åºæ—Óž¼Œæœ‰ä¸¤¿Uå®žçŽ°çš„å½¢å¼<br /> 分别是单向关联和双向兌™”ã€?/p> <p><span style="font-size: 24pt"><em><u><strong>单向兌™”</strong></u></em><br /> <br /> <strong><em><u>双向兌™”</u></em></strong></span></p> <p>  æœ¬èЂ䏭ä‹É用到两个¾c»ï¼Œåˆ†åˆ«æ˜¯ç­¾U?Team)和学ç”?Student)åQŒå­¦ç”Ÿå’Œç­çñ”之间是多对一<br /> 关系ã€?br /> 具体的关联实现源代码如下åQ?br /> Student.hbm.xml<br /> ...<br /> <hibernate-mapping><br />  <class name="model.Student" table="student"><br />   <id name="id" unsaved-value="null"><br />    <generator class="uuid.hex"/><br />   </id><br />   <property name="name" type="string'/><br /> <span style="color: #0000ff"><strong>  <many-to-one name="team"<br />     class="model.Team"<br />     column="team_id" <!--å’Œteam发生兌™”的列å?-><br />     cascade="none"<br />     fetch="join"<br />   /></strong></span><br />  </class><br /> </hibernate-mapping></p> <p><span style="color: #ff0000"><strong><many-to-one>标签å…ähœ‰column属性,column属性æ€ÀL˜¯å’Œå…³è”ç±»åQˆå¯¹äºŽStudent来说åQŒå…³è”ç±»<br /> 是TeamåQ‰çš„主键id 相对应,因此Hibernate会根据student表中的team_idåQŒæ ¹æ®Team表中讄¡½®<br /> çš„id列(一般情况列名也叫idåQ‰ï¼Œå–出team.id=student.team_id的记录,构造成Team对象˜q?br /> 回给Student¾c…R€?/strong></span></p> <p>Team.hbm.xml<br /> ...<br /> <hibernate-mapping><br />  <class name="model.Team" table="team" lazy="true"><br />   <id name="id" unsaved-value="null"><br />    <generator class="uuid.hex"/><br />   </id><br />   <property name="teamName" type="string"/><br /> <strong style="color: #0000ff">  <set name="students" cascade="save-update" lazy="true" <span style="color: #ff0000">inverse="true"></span><br />    <key column="team_id"/><br />    <one-to-many class="model.Student"/><br />   </set></strong><br />  </class><br /> </hibernate-mapping></p> <p><span style="color: #ff0000"><strong>Team对Student是一对多关系åQŒä¸€å¯¹å¤šå…ähœ‰<key column=""/>属性,key标签æ€ÀL˜¯å’Œæœ¬íw«ç±»çš„主é”?br /> 相对应。在取得Team对象æ—Óž¼Œé€šè¿‡Team的主键id与Student表中的team_id˜q›è¡ŒåŒšw…åQŒå¦‚æž?br /> team.id=student.team_idåQŒåˆ™è®¤äؓ此学生是本班¾U§çš„åQŒäºŽæ˜¯åŠ è½½å­¦ç”Ÿï¼ŒæŠŠå­¦ç”Ÿå¯¹è±¡åŠ å…¥Team<br /> 对象的学生集合ã€?/strong></span></p> <p>讄¡½®inverse标签<br />   ç”׃ºŽåœ¨Team.hbm.xml中设¾|®äº†inverse="true",Teamå’ŒStudent之间的关¾p»è{ç”±Student来维æŠ?br /> å› æ­¤åQŒå½“Team掌握¾l´æŠ¤æƒæ—¶(inverse="false"或者默认状态)åQŒå®ƒè´Ÿè´£ž®†è‡ªå·Þqš„id告诉Student<br /> åQŒç„¶åŽHibernate发送update语句åŽÀL›´æ–°è®°å½•。但现在讄¡½®äº†inverse="true"之后åQŒç»´æŠ¤æƒåœ?br /> Student手中åQŒäºŽæ˜¯Hibernate不再发送update语句åQŒè€Œç”±Student自动åŽÕd–å¾—team_idåQŒè€Œè¿™ä¸?br /> 动作其实ž®±æ˜¯å®Œæˆä¸€ä¸?#8220;学生æ·ÕdŠ ç­çñ””动作åQŒä¹Ÿž®±æ˜¯è¯­å¥newStu.setTeam(team)ã€?/p> <img src ="http://www.aygfsteel.com/keweibo/aggbug/171520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2007-12-29 14:32 <a href="http://www.aygfsteel.com/keweibo/articles/171520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一对一兌™”关系的ä‹Éç”?/title><link>http://www.aygfsteel.com/keweibo/articles/171510.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 29 Dec 2007 06:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/171510.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/171510.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/171510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/171510.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/171510.html</trackback:ping><description><![CDATA[<p>  ä¸€å¯¹ä¸€å…³ç³»åœ¨å®žé™…生‹zÖM¸­æ˜¯æ¯”较常见的åQŒå¦‚果学生与íw«ä†¾è¯çš„关系åQŒå­¦ç”Ÿä¸Žæ¡£æ¡ˆçš„å…³¾pȝ­‰½{‰ã€?br />   ä¸€å¯¹ä¸€å…³ç³»åœ¨Hibernate中的实现有两¿Uæ–¹å¼ï¼Œåˆ†åˆ«æ˜?span style="color: red"><strong>主键兌™”</strong></span>å’?span style="color: red"><strong>外键兌™”</strong></span>ã€?/p> <p><span style="font-size: 24pt"><em><u>以主键关è?br /> </u></em></span><br />   ä¸»é”®å…³ç³»çš„重ç‚ÒŽ˜¯åQšå…³è”的两个实体å…׃ín一个主键倹{€?br /> Student.hbm.xml<br /> ...<br /> <hibernate-mapping><br />  <class name="model.Student" table="student" lazy="true"><!--把类和表兌™”èµäh¥--><br />   <id name="id" unsaved-value="null"><!--idçš„äñ”生方式是uuid.hex--><br />    <generator class="uuid.hex"/><br />   </id><br />   <property name="name" type="sring"/><br />   <one-to-one name="cer"<br />     class="model.Certificate"<br />     fetch="join"<br />     cascade="all"<br />   /><!--映射对应的èín份证对象--><br />  </class><br /> </hibernate-mapping></p> <p>Certificate.hbm.xml<br /> ...<br /> <hibernate-mapping><br />  <class name="model.Certificate" table="certificate" lazy="true"><br />   <id name="id"><br />   <!--外键生成机制åQŒå¼•用stu对象的主键作为certificate数据表的主键和外é”?-><br /> <span style="color: #0000ff"><strong>   <generator class="foreign"><br />     <param name="property">stu</param><br />    </generator></strong></span><br />   </id><br />   <one-to-one name="stu"<br />     class="model.Student"<br />     constrained="true" <!--表示Certificate引用了stu的主键作为外é”?-><br />   /><br />  </class><br /> </hibernate-mapping></p> <p>上述的两个配¾|®æ–‡ä»¶åœ¨<one-to-one>标签中都没有讄¡½®column属æ€?br /> åQˆå®žé™…上<one-to-one>标签本èínž®±æ²¡æœ‰column属性)ã€?br /> </p> <p><span style="font-size: 24pt"><br /> <u><em>以外键关è?/em></u><br /> </span><br />   ä»¥å¤–键关联的重点是:两个实体各自有不同的主键åQŒä½†å…¶ä¸­ä¸€ä¸ªå®žä½“有一个外键引ç”?br /> 了另一个表的主键ã€?/p> <p>Student.hbm.xml<br /> ...<br /> <hibernate-mapping><br />  <class name="model.Student" table="student" lazy="true"><br />   <id name="id" nusaved-value="null"><br />    <generator class="uuid.hex"/><br />   </id><br />   <property name="name" type="sring"/><br />   <one-to-one name="cer"<br />     class="model.Certificate"<br />     fetch="join"<br />     cascade="all"<br />   /><!--映射对应的èín份证对象--><br />  </class><br /> </hibernate-mapping><br /> 可以看到Student.hbm.xml和以主键兌™”时的代码是一æ ïLš„åQŒåƈ没有改变ã€?/p> <p>Certificate.hbm.xml<br /> ...<br /> <hibernate-mapping><br />  <class name="model.Certificate" table="certificate" lazy="true"><br />   <id name="id"><br />    <generator class="uuid.hex"/> <!--不再是foreignäº?-><br />   </id><br /> <span style="color: #0000ff"><strong>  <many-to-one name="stu"<br />     class="model.Student"<br />     unique="true" <!--唯一的多对一åQŒå…¶å®žä¹Ÿž®±å˜æˆäº†ä¸€å¯¹ä¸€å…³ç³»--><br />     column="stu_id" <br />   /></strong></span><br />  </class><br /> </hibernate-mapping><br /> 以外键关联的一对一åQŒå…¶å®žæœ¬è´¨ä¸Šå˜æˆäº†ä¸€å¯¹å¤šçš„双向关联了åQŒç¼–写时直接<br /> 按照一对多和多对一的要求编写,最后在many-to-one˜q™ä¸€è¾¹ä¸ŠåŠ ä¸Šä¸€ä¸?br /> unique="true"卛_¯ã€?/p> <img src ="http://www.aygfsteel.com/keweibo/aggbug/171510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2007-12-29 14:00 <a href="http://www.aygfsteel.com/keweibo/articles/171510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3çš„DetachedCriteria支持(è½?http://www.aygfsteel.com/keweibo/articles/165427.htmlKeKeWed, 05 Dec 2007 03:10:00 GMThttp://www.aygfsteel.com/keweibo/articles/165427.htmlhttp://www.aygfsteel.com/keweibo/comments/165427.htmlhttp://www.aygfsteel.com/keweibo/articles/165427.html#Feedback1http://www.aygfsteel.com/keweibo/comments/commentRss/165427.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/165427.html2005-07-12 09:55 作者: robbin 出处åQ?http://dev.yesky.com/241/2033241.shtml

Hibernate3支持DetachedCriteriaåQŒè¿™æ˜¯ä¸€ä¸ªéžå¸¸æœ‰æ„ä¹‰çš„特性!我们知道åQŒåœ¨å¸¸è§„çš„Web¾~–程中,有大量的动态条件查询,即用户在¾|‘页上面自由选择某些条äšgåQ?a class="bluekey" target="_blank">½E‹åºæ ÒŽ®ç”¨æˆ·çš„选择条äšgåQŒåŠ¨æ€ç”ŸæˆSQL语句åQŒè¿›è¡ŒæŸ¥è¯¢ã€?

  针对˜q™ç§éœ€æ±‚,对于分层应用½E‹åºæ¥è¯´åQŒWeb层需要传递一个查询的条äšg列表¾l™ä¸šåŠ¡å±‚å¯¹è±¡åQŒä¸šåŠ¡å±‚å¯¹è±¡èŽ·å¾—˜q™ä¸ªæ¡äšg列表之后åQŒç„¶åŽä¾‹Æ¡å–出条ä»Óž¼Œæž„造查询语句。这里的一个难ç‚ÒŽ˜¯æ¡äšg列表用什么来构造?传统上ä‹É用MapåQŒä½†æ˜¯è¿™¿Uæ–¹å¼ç¼ºé™·å¾ˆå¤§ï¼ŒMap可以传递的信息非常有限åQŒåªèƒ½ä¼ é€’nameå’ŒvalueåQŒæ— æ³•传递究竟要做怎样的条件运½Ž—,½I¶ç«Ÿæ˜¯å¤§äºŽï¼Œž®äºŽåQŒlikeåQŒè¿˜æ˜¯å…¶å®ƒçš„什么,业务层对象必™åȝ¡®åˆ‡æŽŒæ¡æ¯æ¡entry的隐含条件。因此一旦隐含条件改变,业务层对象的查询构造算法必™åȝ›¸åº”修改,但是˜q™ç§æŸ¥è¯¢æ¡äšg的改变是隐式¾U¦å®šçš„,而不是程序代码约束的åQŒå› æ­¤éžå¸¸å®¹æ˜“出错ã€?

  DetachedCriteria可以解决˜q™ä¸ªé—®é¢˜åQŒå³åœ¨web层,½E‹åºå‘˜ä‹É用DetachedCriteria来构造查询条ä»Óž¼Œç„¶åŽž®†è¿™ä¸ªDetachedCriteriaä½œäØ“æ–ÒŽ³•调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后åQŒå¯ä»¥åœ¨session范围内直接构造CriteriaåQŒè¿›è¡ŒæŸ¥è¯¢ã€‚就此,查询语句的构造完全被搬离到web层实玎ͼŒè€Œä¸šåŠ¡å±‚åˆ™åªè´Ÿè´£å®ŒæˆæŒä¹…åŒ–å’ŒæŸ¥è¯¢çš„å°è£…å³å¯ï¼Œä¸ŽæŸ¥è¯¢æ¡ä»¶æž„é€ å®Œå…¨è§£è€¦ï¼Œéžå¸¸å®Œç¾ŽåQè¿™ææ€•也是以前很多企囑֜¨web层代码中构造HQL语句的äh惛_®žçŽ°çš„æ¢¦æƒ³å§ï¼

  ½CÞZ¾‹ä»£ç ç‰‡æ®µå¦‚下åQ?

  web层程序构造查询条ä»Óž¼š

  java代码:

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20)));

  Departmentå’ŒEmployee是一对多兌™”åQŒæŸ¥è¯¢æ¡ä»¶äØ“åQ?

  名称æ˜?#8220;department”开发部门;
  部门里面的雇员年龄大�0岁;

  业务层对象ä‹É用该条äšg执行查询åQ?

  java代码:

detachedCriteria.getExecutableCriteria(session).list();

  最大的意义在于åQŒä¸šåŠ¡å±‚ä»£ç æ˜¯å›ºå®šä¸å˜çš„åQŒæ‰€æœ‰æŸ¥è¯¢æ¡ä»¶çš„æž„造都在web层完成,业务层只负责在session内执行之。这样代码就可放之四‹¹¯‚€Œçš†å‡†ï¼Œéƒ½æ— ™åÖM¿®æ”¹äº†ã€?br />
  然而Spring和Hibernate3的DetachedCriteria有不兼容的问题,因此在Spring环境下面使用Hibernate3需要注意:

  Springçš„HibernateTemplate提供了Hibernate的完¾ŸŽå°è£…,即通过匿名¾cÕd®žçŽ°å›žè°ƒï¼Œæ¥ä¿è¯Session的自动资源管理和事务的管理。其中核心方法是åQ?

  java代码:

HibernateTemplate.execute(new HibernateCallback() {
 public Object doInHibernate(Session session) throws HibernateException {
  ....
 }
}

  回调æ–ÒŽ³•提供了sessionä½œäØ“å‚æ•°åQŒæœ‰äº†sessionåQŒå°±å¯ä»¥è‡ªç”±çš„ä‹É用Hibernate API¾~–程了。ä‹É用了spring的之后,代码修改如下åQ?

  web层代码:

  java代码:

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20)));
departmentManager.findByCriteria(detachedCriteria);

  构造detachedCriteriaåQŒä½œä¸ºå‚æ•îC¼ é€’ç»™departmentManager

  业务层代码ä‹É用springåQŒDepartmentManagerçš„findByCriteria如下åQ?

  java代码:

public List findByCriteria(final DetachedCriteria detachedCriteria) {
 return (List) getHibernateTemplate().execute(new HibernateCallback() {
  public Object doInHibernate(Session session) throws HibernateException {
   Criteria criteria = detachedCriteria.getExecutableCriteria(session);
   return criteria.list();
  }
 });
}

  实际上也ž®±æ˜¯åQ?

  java代码:

Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();

  而已

  但是该程序代码执行,会抛出强制类型è{换异常!

  我跟ítªäº†ä¸€ä¸‹springå’ŒHibernate源代码,原因如下åQ?

  springçš„HibernateTemplateçš„executeæ–ÒŽ³•提供的回调接口具有Sessionä½œäØ“å‚æ•°åQŒä½†æ˜¯å®žé™…上åQŒé»˜è®¤æƒ…况下åQŒHibernateTemplate传递给回调接口的sessionòq¶ä¸æ˜¯org.hibernate.impl.SessionImpl¾c»ï¼Œè€Œæ˜¯SessionImpl¾cȝš„一个Proxy¾c…R€‚之所以替换成ä¸ÞZ¸€ä¸ªProxy¾c»ï¼ŒHibernateTemplate的注释说明,Proxy提供了一些额外的功能åQŒåŒ…括自动设¾|®CachableåQŒTransaction的超时时é—ß_¼ŒSession资源的更¿U¯æžçš„关闭等½{‰ã€?

  java代码:

private boolean exposeNativeSession = false;
...

  executeæ–ÒŽ³•内部åQ?

Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));

  但是遗憾的是åQŒHibernateçš„DetachedCriteriaçš„setExecutableCriteriaæ–ÒŽ³•却要求将sessionå‚æ•°å¼ºåˆ¶è½¬äØ“SessionImplåQŒä½†æ˜¯spring传过来的却是一个Proxy¾c»ï¼Œå› æ­¤ž®±æŠ¥é”™äº†ã€?

  java代码:

public Criteria getExecutableCriteria(Session session) {
 impl.setSession( (SessionImpl) session ); // 要求SessionImplåQŒSpring传递的是Proxy
 return impl;
}

  解决æ–ÒŽ³•åQŒç¦æ­¢Springçš„HibernateTemplate传递Proxy¾c»ï¼Œå¼ºåˆ¶è¦æ±‚它传递真实的SessionImpl¾c»ï¼Œå³ç»™exexuteæ–ÒŽ³•增加一个参敎ͼŒæä¾›å‚数为trueåQŒå¦‚下:

  java代码:

public List findByCriteria(final DetachedCriteria detachedCriteria) {
 return (List) getHibernateTemplate().execute(new HibernateCallback() {
  public Object doInHibernate(Session session) throws HibernateException {
   Criteria criteria = detachedCriteria.getExecutableCriteria(session);
   return criteria.list();
  }
 }, true);
}


]]>
扚w‡æŠ“取http://www.aygfsteel.com/keweibo/articles/158584.htmlKeKeTue, 06 Nov 2007 08:19:00 GMThttp://www.aygfsteel.com/keweibo/articles/158584.htmlhttp://www.aygfsteel.com/keweibo/comments/158584.htmlhttp://www.aygfsteel.com/keweibo/articles/158584.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/158584.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/158584.htmlHibernate可以充分有效的ä‹É用批量抓取(扚w‡ç«‹å³åŠ è²å’?span style="color: #0000ff">扚w‡å»¶è¿ŸåŠ è²åQ‰ï¼Œä¹Ÿå°±æ˜¯è¯´åQŒå¦‚果仅一个访问代理(或集合)åQŒé‚£ä¹ˆHibernatež®†ä¸è½½å…¥å…¶ä»–未实例化的代理ã€?扚w‡æŠ“取是åšg˜qŸæŸ¥è¯¢æŠ“取的优化æ–ÒŽ¡ˆåQŒä½ å¯ä»¥åœ¨ä¸¤¿Uæ‰¹é‡æŠ“取方案之间进行选择åQšåœ¨¾cȝñ”别和集合¾U§åˆ«ã€?

一对多、多对多åQˆæœ«ç«¯äؓ多)的情况:在集合的配置中设¾|®ï¼Œä»?set ä¸ÞZ¾‹åQŒå¦‚下所½Cºï¼š 

        <set name="students" inverse="true" cascade="all" lazy="false" batch-size="2" ><!-- 一对多的åšg˜qŸåŠ è½½è®¾¾|?-->
            <key>
                <column name="TEAMID" length="32" not-null="true" />
            </key>
            <one-to-many class="edu.dgut.ke.model.Student" />
        </set>

 ä¸€å¯¹ä¸€ã€å¤šå¯¹ä¸€åQˆæœ«ç«¯äؓ一åQ‰çš„æƒ…况åQšå¦‚果要å¯ÒŽœ«ç«¯äؓ一的关联设¾|®æ‰¹é‡åŠ è½½ï¼Œè¦åœ¨“一”˜q™ç«¯çš„配¾|®æ–‡ä»¶ä¸­˜q›è¡Œè®„¡½®åQŒæ¯”如学生对íw«ä†¾è¯ï¼Œè¦å®žçŽ°å¯¹ç­çñ”的批量加载,应设¾|®å¦‚ä¸?br />                 <class name="edu.dgut.ke.model.Certificate" table="CERTIFICATE" lazy="true" batch-size="10" >

‹¹‹è¯•例子

Session session = HibernateSessionFactory.getSession();
  List list = session.createQuery("from Student").list();
  HibernateSessionFactory.closeSession();
åQˆStudent对Certificate是采用立卛_Š è½½ç­–ç•¥ï¼‰
控制台输�/u>

Hibernate: select student0_.ID as ID0_, student0_.cardId as cardId0_, student0_.TEAMID as TEAMID0_, student0_.STUDENTNAME as STUDENTN4_0_ from STUDENT student0_
Hibernate: select certificat0_.ID as ID1_0_, certificat0_.`DESCRIBE` as DESCRIBE2_1_0_ from CERTIFICATE certificat0_ where certificat0_.ID in (?, ?, ?, ?, ?, ?)


]]>
外连接与预先抓取的区åˆ?摘抄于hibernate开发及整合应用大全) http://www.aygfsteel.com/keweibo/articles/158559.htmlKeKeTue, 06 Nov 2007 07:08:00 GMThttp://www.aygfsteel.com/keweibo/articles/158559.htmlhttp://www.aygfsteel.com/keweibo/comments/158559.htmlhttp://www.aygfsteel.com/keweibo/articles/158559.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/158559.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/158559.html假设有一个类A,它有两个属性property1å’Œproperty2,则HQL语句"from A as a left outer join a.property1"有一个原åˆ?-HQL语句忽略配置文äšg的预先抓取策ç•?/u>,˜q™å¥è¯æœ‰ä¸¤ä¸ªæ„æ€?

1.不管A¾cÕd¯¹property1在配¾|®æ–‡ä»‰™‡Œæ˜¯ä»€ä¹ˆç­–ç•?可能是预先抓å?立即或åšg˜qŸæ£€ç´?它们都失æ•?,˜q™æ—¶éƒ½é‡‡ç”¨HQL指定的左外连æŽ?左外˜qžæŽ¥å¿…定会初始化property1属æ€?或对è±?,但是如果配置文äšg里对property1的检索策略是延迟加蝲,A¾cÕd¾— 到对properyt1的引ç”?ä¸ÞZº†å¾—到˜q™ä¸ªå¼•用,需要再‹Æ¡å‘送一条SQL语句来确立这¿Uå¼•用关¾p?˜q™ç§æƒ…况在property1为集合时¾lå¸¸å‡ºçް.

2.A¾cÕdœ¨é…ç½®æ–‡äšg中设¾|®çš„对property2的预先抓取策略将被忽ç•?/strong>(不管˜q™ä¸ª½{–略是fetch或是select),对property2有媄响的讄¡½®æ˜¯ç«‹å›_’Œå»¶è¿ŸåŠ è²,hibernate只看得到˜q™ä¸¤¿Uç­–ç•?所以在使用语句"from A as a left outer join a.property1"æ—?property2的加载策略将仅由lazy="true"或者是lazy="false"来决å®?nbsp;


Team.hbm.xml 
...    ...
       <set name="students" inverse="true" cascade="all" lazy="true" fetch="join"><!-- 一对多的åšg˜qŸåŠ è½½è®¾¾|?-->
            <key>
                <column name="TEAMID" length="32" not-null="true" />
            </key>
            <one-to-many class="edu.dgut.ke.model.Student" />
        </set>
...    ...
Student.hbm.xml
...    ...
        <many-to-one name="certificate"
         class="edu.dgut.ke.model.Certificate"
         unique="true"
         column="cardId"
         cascade="all"
         lazy="false"
         fetch="join">
        </many-to-one>
        <many-to-one name="team" class="edu.dgut.ke.model.Team" fetch="join">
            <column name="TEAMID" length="32" not-null="true" />
        </many-to-one>
...    ...
‹¹‹è¯•代码
  Session session = HibernateSessionFactory.getSession();
  List list = session.createQuery("from Student as s left join s.team").list();
  HibernateSessionFactory.closeSession();
  //list 包括两个长度ä¸?的数¾l?每一个数¾l„中包括一个学生对象和一个班¾U§å¯¹è±?br />   Object[] stuAndTeam1 = (Object[]) list.get(0);
  Student stu = (Student) stuAndTeam1[0];
  System.out.println(stu.getStudentname());
  System.out.println(stu.getTeam().getTeamname());
  System.out.println(stu.getTeam().getStudents().size());

控制台输�/u>
Hibernate: select student0_.ID as ID0_0_, team1_.ID as ID2_1_, student0_.cardId as cardId0_0_, student0_.TEAMID as TEAMID0_0_, student0_.STUDENTNAME as STUDENTN4_0_0_, team1_.TEAMNAME as TEAMNAME2_1_ from STUDENT student0_ left outer join TEAM team1_ on student0_.TEAMID=team1_.ID
Hibernate: select certificat0_.ID as ID1_0_, certificat0_.`DESCRIBE` as DESCRIBE2_1_0_ from CERTIFICATE certificat0_ where certificat0_.ID=?
Hibernate: select certificat0_.ID as ID1_0_, certificat0_.`DESCRIBE` as DESCRIBE2_1_0_ from CERTIFICATE certificat0_ where certificat0_.ID=?
张三
05计算机应用技�1)�br /> Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: edu.dgut.ke.model.Team.students, no session or session was closed
 at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
 at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
 at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:97)
 at org.hibernate.collection.PersistentSet.size(PersistentSet.java:114)
 at edu.dgut.ke.test.chapter3.Query.main(Query.java:44)


注意åQšåœ¨é…ç½®æ–‡äšg中设¾|®çš„‹‚€ç´¢ç­–略只能媄响到session.get()或者session.load()æ–ÒŽ³•åQŒå¯¹äºŽç›´æŽ¥ä‹Éç”?br /> session.createQuery("from Student as s left join s.team")˜q™ç§æŒ‡æ˜ŽHQL的方式,ž®†å¿½ç•¥é…¾|®æ–‡ä»¶çš„预先抓取‹‚€ç´¢ç­–略(学生对班¾U§çš„预先‹‚€ç´¢ç­–略被忽略åQ‰ï¼Œ˜q™è¯­å¥æŒ‡æ˜Žäº†å­¦ç”Ÿå’Œç­¾U§ä¹‹é—´ä‹É用左外连接策略,因此控制台输出的½W¬ä¸€æ¡è¯­å¥ï¼Œå³ä‹É用了左外˜qžæŽ¥å¾—到äº?个对象:2个学生和1个班¾U§ã€?br />         å¾—到了学生对象之后,学生以èín份证的预先抓取策略失效,所以会有第二条和第三条语句åQŒå³ä½¿ç”¨äº†ç«‹å›_Š è½?br />         å¾—到班çñ”对象后,ç”׃ºŽç­çñ”对学生采用åšg˜qŸåŠ è½½ï¼ˆ˜q™ä¸ª½{–略不会被忽略)åQŒäºŽæ˜¯ç­¾U§çš„学生集合òq¶æœªå¾—到初始化,所以当输出学生的äh敎ͼŒž®±æŠ›å‡ÞZº†ä¾‹å¤–ã€?

]]>
Hibernate配置属æ€?åQˆhibernate.max_fetch_depthåQ?/title><link>http://www.aygfsteel.com/keweibo/articles/158537.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 06 Nov 2007 06:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/158537.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/158537.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/158537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/158537.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/158537.html</trackback:ping><description><![CDATA[ Hibernate配置属æ€? <table summary="Hibernate配置属æ€? border="1"> <colgroup> <col> <col></colgroup> <thead> <tr> <th>属性名</th> <th>用é€?/th> </tr> </thead> <tbody> <tr> <td><tt class="literal">hibernate.dialect</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>Hibernate<tt class="literal">方言åQˆDialectåQ?/tt>的类å?- 可以让Hibernate使用某些特定的数据库òq›_°çš„特æ€?/em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">full.classname.of.Dialect</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.default_schema</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>在生成的SQL中,scheml/tablespace的全限定å?/em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">SCHEMA_NAME</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.session_factory_name</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>æŠ?tt class="literal">SessionFactory</tt>¾l‘定到JNDI中去.</em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">jndi/composite/name</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.use_outer_join</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>允许使用外连接抓å?</em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">true</tt> | <tt class="literal">false</tt> </p> </td> </tr> <tr> <td><tt class="literal" style="color: #0000ff">hibernate.max_fetch_depth</tt></td> <td style="color: #0000ff"><span id="wmqeeuq" class="emphasis"><em>讄¡½®å¤–连接抓取树的最大深åº?/em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> 廸™®®è®„¡½®ä¸?tt class="literal">0</tt>åˆ?tt class="literal">3</tt>之间 </p> </td> </tr> <tr> <td><tt class="literal">hibernate.jdbc.fetch_size</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>一个非零å€û|¼Œç”¨æ¥å†›_®šJDBC的获取量大小ã€?会调用calls <tt class="literal">Statement.setFetchSize()</tt>).</em></span></td> </tr> <tr> <td><tt class="literal">hibernate.jdbc.batch_size</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>一个非零å€û|¼Œä¼šå¼€å¯Hibernate使用JDBC2的批量更新功èƒ?/em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> 廸™®®å€¼åœ¨ <tt class="literal">5</tt> å’?<tt class="literal">30</tt>之间ã€?</p> </td> </tr> <tr> <td><tt class="literal">hibernate.jdbc.use_scrollable_resultset</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>允许Hibernate使用JDBC2提供的可滚动¾l“果集。只有在使用用户自行提供的连接时åQŒè¿™ä¸ªå‚数才是必需的。否则Hibernate会ä‹É用连接的元数æ?metadata)ã€?/em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">true</tt> | <tt class="literal">false</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.jdbc.use_streams_for_binary</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>在从JDBCè¯Õd†™<tt class="literal">binaryåQˆäºŒ˜q›åˆ¶åQ?/tt>或è€?tt class="literal">serializableåQˆå¯åºåˆ—化)</tt>¾cÕdž‹æ—?是否使用stream(‹¹ï¼‰</em></span>. ˜q™æ˜¯ä¸€ä¸ªç³»¾lŸçñ”别的属性ã€? <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">true</tt> | <tt class="literal">false</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.cglib.use_reflection_optimizer</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>是否使用CGLIB来代替运行时反射操作。(¾pȝ»Ÿ¾U§åˆ«å±žæ€§ï¼Œé»˜è®¤ä¸ºåœ¨å¯èƒ½æ—‰™ƒ½ä½¿ç”¨CGLIBåQ?在调试的时候有时候ä‹É用反ž®„会有用ã€?/em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">true</tt> | <tt class="literal">false</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.jndi.<span id="wmqeeuq" class="emphasis"><em><propertyName></em></span></tt></td> <td><span id="wmqeeuq" class="emphasis"><em>æŠ?tt class="literal">propertyName</tt>˜q™ä¸ªå±žæ€§ä¼ é€’到JNDI <tt class="literal">InitialContextFactory</tt>åŽ?/em></span> (可é€? </td> </tr> <tr> <td><tt class="literal">hibernate.connection.isolation</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>事务隔离¾U§åˆ«</em></span> (可é€? <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">1, 2, 4, 8</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.connection.<span id="wmqeeuq" class="emphasis"><em><propertyName></em></span></tt></td> <td><span id="wmqeeuq" class="emphasis"><em>æŠ?<tt class="literal">propertyName</tt>˜q™ä¸ªJDBC 属性传递到<tt class="literal">DriverManager.getConnection()</tt>åŽ?/em></span>. </td> </tr> <tr> <td><tt class="literal">hibernate.connection.provider_class</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>指定一个自定义çš?tt class="literal">ConnectionProvider</tt>¾cÕd</em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">classname.of.ConnectionProvider</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.cache.provider_class</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>指定一个自定义çš?tt class="literal">CacheProvider</tt>¾~“存提供者的¾cÕd</em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">classname.of.CacheProvider</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.transaction.factory_class</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>指定一个自定义çš?tt class="literal">TransactionFactory</tt>¾cÕdåQŒHibernate Transaction APIž®†ä¼šä½¿ç”¨.</em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">classname.of.TransactionFactory</tt> </p> </td> </tr> <tr> <td><tt class="literal">jta.UserTransaction</tt></td> <td><span id="wmqeeuq" class="emphasis"><em><tt class="literal">JTATransactionFactory</tt> 用来获取JTA <tt class="literal">UserTransaction</tt>çš„JNDIå?</em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">jndi/composite/name</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.transaction.manager_lookup_class</tt></td> <td><span id="wmqeeuq" class="emphasis"><em><tt class="literal">TransactionManagerLookup</tt>的类å?- 当在JTA环境中,JVM¾U§åˆ«çš„缓存被打开的时候ä‹Éç”?</em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">classname.of.TransactionManagerLookup</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.query.substitutions</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>把Hibernate查询中的一些短语映ž®„䨓SQL短语。(比如说短语可能是函数或者字½W¦ï¼‰ .</em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.show_sql</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>把所有的SQL语句都输出到控制å?å¯ä»¥ä½œäØ“log功能的一个替ä»?.</em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">true</tt> | <tt class="literal">false</tt> </p> </td> </tr> <tr> <td><tt class="literal">hibernate.hbm2ddl.auto</tt></td> <td><span id="wmqeeuq" class="emphasis"><em>自动输出schema创徏DDL语句.</em></span> <p><span id="wmqeeuq" class="strong">取å€?</span> <tt class="literal">update</tt> | <tt class="literal">create</tt> | <tt class="literal">create-drop</tt> </p> </td> </tr> </tbody> </table> <tt class="literal" style="color: #0000ff">hibernate.max_fetch_depth</tt><span style="color: #0000ff">=0æ—Óž¼Œè¡¨ç¤ºä¸å…è®¸å¤–˜qžæŽ¥åQŒè¿™æ—¶çš„预先抓取½{–ç•¥ž®Þq®—讄¡½®äº†ä¹Ÿæ˜¯å¤±æ•ˆçš„åQŒå–而代之的是立卛_Š è½½ç­–ç•¥ã€?/span> <img src ="http://www.aygfsteel.com/keweibo/aggbug/158537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2007-11-06 14:04 <a href="http://www.aygfsteel.com/keweibo/articles/158537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Hibernate.initialize(Object obj)æ–ÒŽ³•初始化一个代理对象或者集å?/title><link>http://www.aygfsteel.com/keweibo/articles/157978.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 03 Nov 2007 14:17:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/157978.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/157978.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/157978.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/157978.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/157978.html</trackback:ping><description><![CDATA[<p>.............</p> <p>public class Query {</p> <p><br />  public static void main(String[] args) {<br /> <br />   //打开Session取得Student对象,后关闭Session<br />   Student student = getStudent();<br />   //打开另一个Session.调用update()æ–ÒŽ³•,å› äØ“åœ¨ä¸Šé¢çš„Session关闭å?<br />   //student对象成了è„Þq®¡çжæ€?在另一个Session中无法初始化一个脱½Ž¡å¯¹è±?必须重新兌™”<br />   HibernateSessionFactory.getSession().update(student.getTeam());<br />   //使用initializeæ–ÒŽ³•初始化一个代理对象或者集å?æ­¤ä»£ç†åÆˆä¸èƒ½ä¿è¯å†…éƒ¨åµŒå¥—çš„å¯¹è±¡æˆ–è€…é›†åˆè¢«åˆå§‹åŒ?<br />   Hibernate.initialize(student.getTeam());<br />   System.out.println(student.getTeam().getTeamname());<br />   HibernateSessionFactory.closeSession();<br />  }</p> <p>... <br />  public static Student getStudent() {<br />   StudentDAO studentDAO = new StudentDAO();<br />   <br />   Session session = studentDAO.getSession();<br />   Student student = (Student) session.get(Student.class, "2c9ab2d516056609011605660e7e0001");<br />   session.close();<br />   return student;<br />  }<br /> ... <br /> }<br /> </p> <img src ="http://www.aygfsteel.com/keweibo/aggbug/157978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2007-11-03 22:17 <a href="http://www.aygfsteel.com/keweibo/articles/157978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate延迟加蝲http://www.aygfsteel.com/keweibo/articles/157970.htmlKeKeSat, 03 Nov 2007 13:13:00 GMThttp://www.aygfsteel.com/keweibo/articles/157970.htmlhttp://www.aygfsteel.com/keweibo/comments/157970.htmlhttp://www.aygfsteel.com/keweibo/articles/157970.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/157970.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/157970.html
Team.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="edu.dgut.ke.model.Team" table="TEAM"  lazy ="true"  ><!-- 多对一的åšg˜qŸåŠ è½½è®¾¾|?-->
        <id name="id" type="java.lang.String">
            <column name="ID" length="32" />
            <generator class="uuid.hex" />
        </id>
        <property name="teamname" type="java.lang.String">
            <column name="TEAMNAME" length="32" not-null="true" unique="true" />
        </property>
        <set name="students" inverse="true" cascade="all" lazy="true" >  <!-- ä¸€å¯¹å¤šçš„åšg˜qŸåŠ è½½è®¾¾|?nbsp;-->
            <key>
                <column name="TEAMID" length="32" not-null="true" />
            </key>
            <one-to-many class="edu.dgut.ke.model.Student" />
        </set>
    </class>
</hibernate-mapping>

Certificate.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="edu.dgut.ke.model.Certificate" table="CERTIFICATE" lazy="true"  ><!-- ä¸€å¯¹ä¸€çš„åšg˜qŸåŠ è½½è®¾¾|?nbsp;-->

        <id name="id" type="java.lang.String">
            <column name="ID" length="32" />
            <generator class="uuid">
           
            </generator>
        </id>
        <property name="describe" type="java.lang.String">
            <column name="`DESCRIBE`" length="50" not-null="true" />
        </property>
        <one-to-one name="student"
         class="edu.dgut.ke.model.Student"
         constrained="true"  ><!-- ä¸€å¯¹ä¸€çš„åšg˜qŸåŠ è½½è®¾¾|?nbsp;-->

        </one-to-one>
    </class>
</hibernate-mapping>

Student.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="edu.dgut.ke.model.Student" table="STUDENT" lazy="true"  >
        <id name="id" type="java.lang.String">
            <column name="ID" length="32" />
            <generator class="uuid.hex" />
        </id>
        <many-to-one name="certificate"
         class="edu.dgut.ke.model.Certificate"
         unique="true"
         column="cardId"
         cascade="all"
         >
        </many-to-one>
        <many-to-one name="team" class="edu.dgut.ke.model.Team">
            <column name="TEAMID" length="32" not-null="true" />
        </many-to-one>
        <property name="studentname" type="java.lang.String">
            <column name="STUDENTNAME" length="16" not-null="true" unique="true" />
        </property>
    </class>
</hibernate-mapping>
注意åQšå¯¹one-to-one 关系˜q›è¡Œå»¶è¿ŸåŠ è²å’Œå…¶ä»–å…³¾pȝ›¸æ¯”稍微有些不同。many-to-one çš„åšg˜qŸåŠ è½½æ˜¯åœ¨é…¾|®æ–‡ä»¶çš„class 标签
上设¾|?lazy="true" åQŒone-to-many å’?many-to-many çš„åšg˜qŸåŠ è½½æ˜¯åœ?set 标签中设¾|®lazy="true"。而one-to-one 不只要在 classs
标签讄¡½® lazy="true"åQŒè€Œä¸”要在one-to-one 标签中设¾|®constrained="true" ã€?br /> 如果不设¾|®constrained="true"åQŒåˆ™ä¸€å¯¹ä¸€æŸ¥è¯¢ä½¿ç”¨é»˜è®¤çš„预先抓取策ç•?fetch="join")ã€?/strong>




]]>
修改è„Þq®¡(Detached)对象http://www.aygfsteel.com/keweibo/articles/156713.htmlKeKeMon, 29 Oct 2007 08:15:00 GMThttp://www.aygfsteel.com/keweibo/articles/156713.htmlhttp://www.aygfsteel.com/keweibo/comments/156713.htmlhttp://www.aygfsteel.com/keweibo/articles/156713.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/156713.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/156713.html

很多½E‹åºéœ€è¦åœ¨æŸä¸ªäº‹åŠ¡ä¸­èŽ·å–å¯¹è±¡ï¼Œç„¶åŽž®†å¯¹è±¡å‘送到界面层去操作åQŒæœ€åŽåœ¨ä¸€ä¸ªæ–°çš„事务保存所做的修改ã€?在高òq¶å‘讉K—®çš„环境中使用˜q™ç§æ–¹å¼åQŒé€šå¸¸ä½¿ç”¨é™„带版本信息的数据来保证˜q™äº›“é•?#8220;工作单元之间的隔¼›…R€?

Hibernate通过提供使用Session.update()æˆ?tt class="literal" style="color: #0000ff">Session.merge()æ–ÒŽ³• 重新兌™”è„Þq®¡å®žä¾‹çš„办法来支持˜q™ç§æ¨¡åž‹ã€?

// in the first session
Cat cat = (Cat) firstSession.load(Cat.class, catId);
Cat potentialMate = new Cat();
firstSession.save(potentialMate);
// in a higher layer of the application
cat.setMate(potentialMate);
// later, in a new session
secondSession.update(cat);  // update cat
secondSession.update(mate); // update mate

如果å…ähœ‰catId持久化标识的Cat之前已经è¢?tt class="literal">另一Session(secondSession)装蝲了, 应用½E‹åº˜q›è¡Œé‡å…³è”操ä½?reattach)的时候会抛出一个异常ã€?

如果你确定当前session没有包含与之å…ähœ‰ç›¸åŒæŒä¹…化标识的持久实例åQŒä‹Éç”?tt class="literal">update()ã€?如果想随时合òq¶ä½ çš„的改动而不考虑session的状态,使用merge()ã€?/strong> 换句话说åQŒåœ¨ä¸€ä¸ªæ–°session中通常½W¬ä¸€ä¸ªè°ƒç”¨çš„æ˜?tt class="literal">update()æ–ÒŽ³•åQŒä»¥ä¾¿ä¿è¯é‡æ–°å…³è”脱½Ž?detached)对象的操作首先被执行ã€?

希望相关联的è„Þq®¡å¯¹è±¡åQˆé€šè¿‡å¼•用“可到è¾?#8221;的脱½Ž¡å¯¹è±¡ï¼‰çš„æ•°æ®ä¹Ÿè¦æ›´æ–°åˆ°æ•°æ®åº“æ—¶åQˆåƈ且也仅仅在这¿Uæƒ…况)åQ?应用½E‹åºéœ€è¦å¯¹è¯¥ç›¸å…Œ™”的脱½Ž¡å¯¹è±¡å•独调ç”?tt class="literal">update() 当然˜q™äº›å¯ä»¥è‡ªåŠ¨å®ŒæˆåQŒå³é€šè¿‡ä½¿ç”¨ä¼ æ’­æ€§æŒä¹…化(transitive persistence)åQŒè¯·çœ?a title="11.11. ä¼ æ’­æ€§æŒä¹…化(transitive persistence)" tppabs="http://www.hibernate.org/hib_docs/v3/reference/zh-cn/html/objectstate.html#objectstate-transitive">½W?nbsp;11.11 èŠ?“传播性持久化(transitive persistence)”ã€?

lock()æ–ÒŽ³•也允许程序重新关联某个对象到一个新session上。不˜q‡ï¼Œè¯¥è„±½Ž?detached)的对象必™åÀL˜¯æ²¡æœ‰ä¿®æ”¹˜q‡çš„åQ?

//just reassociate:
sess.lock(fritz, LockMode.NONE);
//do a version check, then reassociate:
sess.lock(izi, LockMode.READ);
//do a version check, using SELECT ... FOR UPDATE, then reassociate:
sess.lock(pk, LockMode.UPGRADE);

è¯äh³¨æ„ï¼Œlock()可以搭配多种LockModeåQ?更多信息请阅读API文档以及关于事务处理(transaction handling)的章节。重新关联不æ˜?tt class="literal">lock()的唯一用途ã€?

其他用于长时间工作单元的模型会在½W?nbsp;12.3 èŠ?“乐观òq¶å‘控制(Optimistic concurrency control)”中讨论ã€?

文章出处:http://docs.huihoo.com/framework/hibernate/reference-v3_zh-cn/objectstate.html

]]>
Session¾~“存机制 操纵持久化对è±?http://www.aygfsteel.com/keweibo/articles/156578.htmlKeKeMon, 29 Oct 2007 01:21:00 GMThttp://www.aygfsteel.com/keweibo/articles/156578.htmlhttp://www.aygfsteel.com/keweibo/comments/156578.htmlhttp://www.aygfsteel.com/keweibo/articles/156578.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/156578.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/156578.htmlSession 的缓å­?br />   Hibernate中缓存分ä¸ÞZ¸¤¿Uï¼šä¸€¾U§ç¼“å­?Session¾U§åˆ«)和二¾U§ç¼“å­?br /> (SessionFactory¾U§åˆ«)ã€?br />    Session 的作ç”?
    1)充当蓄水池的作用,减少½E‹åºè®‰K—®æ•°æ®åº“çš„‹Æ¡æ•°.很多对象数据不是¾lå¸¸æ”¹å˜çš?½W¬ä¸€‹Æ¡è®¿é—®è¿™äº›å¯¹è±¡æ—¶,Hibernate会将它们æ”?br /> 入缓存中,以后只要˜q™ä¸ªå¯¹è±¡æ²¡æœ‰æ”¹åЍ˜q?讉K—®˜q™ä¸ªå¯¹è±¡æ—¶Hibernatež®×ƒ¸ä¼šåŽ»æ•°æ®åº“é‡ŒåŠ è²å®ƒçš„æ•°æ®,而是从内存中直接˜q”回应用½E‹åº,˜q™æ ·å­æ•ˆçŽ‡å°±æ¯”è¾ƒé«˜äº†.
    2)保证¾~“存中的数据与数据库同步.¾~“存毕竟不是数据åº?它的数据可能和数据库不一è‡?˜q™æ—¶Hibernate会负责将¾~“存中的数据同步到数据库.当然˜q™è¦å‚ç…§FlushMode的具体设¾|?
   Hibernate向我们提供的主要的操¾U‰|•°æ®åº“的接å?Sessionž®±æ˜¯å…¶ä¸­çš„一ä¸?它提供了基本的增,åˆ?æ”?查方æ³?而且å…ähœ‰ä¸€ä¸ªç¼“存机åˆ?能够按照某个旉™—´ç‚?按照¾~“存中的持久化对象属性的变化来更新数据库,着ž®±æ˜¯Session的缓存清理过½E?在Hibernate中对象分ä¸ÞZ¸‰ä¸ªçжæ€?临时,持久åŒ?游离.如果我们希望JAVA里的一个对象一直存åœ?ž®±å¿…™åÀLœ‰ä¸€ä¸ªå˜é‡ä¸€ç›´å¼•用着˜q™ä¸ªå¯¹è±¡.当这个变量没äº?对象也就被JVM回收äº?当然˜q™ä¸ªæ˜¯æœ€åŸºæœ¬çš„常识了.当Sessionçš„save()æ–ÒŽ³•持久化了一个对象的时å€?即ä‹É˜q™ä¸ªå¯¹è±¡çš„引用变量小时了.˜q™ä¸ªå¯¹è±¡ä¹Ÿä¾ç„¶å­˜åœ?因䨓Sessoin里保存了一个这个对象的引用,当然Session¾~“存被清½I?˜q™ä¸ªå¯¹è±¡ž®±OVERäº?在这个对象保存在Sessoin的时候如果调用load()æ–ÒŽ³•试图åŽÀL•°æ®åº“中加载一个对è±?˜q™ä¸ªæ—¶å€™Session会先判断¾~“存中有没有˜q™ä¸ªå¯¹è±¡,如果有了,那么ž®×ƒ¸éœ€è¦åŽ»æ•°æ®åº“åŠ è½½äº†.˜q™æ ·å¯ä»¥å‡å°‘讉K—®æ•°æ®åº“的频率,˜q˜å¯ä»¥ä¿è¯ç¼“存中的对象于数据库的同步.
      Session有两个方æ³?一个commit()事务提交æ–ÒŽ³•,˜q˜æœ‰flush()åˆäh–°¾~“å­˜æ–ÒŽ³•,都有着清理¾~“存的作ç”?flush()˜q›è¡Œ¾~“存的清ç?执行一¾pÕdˆ—çš„SQL语句,但不会提交事åŠ?而commit()æ–ÒŽ³•会先调用flush()æ–ÒŽ³•,然后在提交事åŠ?Session˜q˜æœ‰ä¸€ä¸ªæ–¹æ³•就是setFushMode()æ–ÒŽ³•,ç”¨æˆ·è®‘Ö®šæ¸…ç†¾~“存的时间点,主要有下面几¿Uæ¨¡å¼?默认Flush.Mode.AUTO
      1)FlushMode.AUTO  Hibernate åˆ¤æ–­å¯¹è±¡çš„属性是更改,如果被更改过成了脏数æ?则会在下一个查询语句前ž®†æ›´æ–°æ­¤æ”¹åŠ¨ä»¥ä¿è¯åŒæ­¥æ•°æ®åº“.
      2)FlushMode.COMMIT  在事务结束之前清理Session的缓å­?其它ä»ÖM½•时候都不清理缓å­?br />       3)FlushMode.NEVER  除非强制调用Sessionçš„flush()æ–ÒŽ³•,å¦åˆ™æ°æ€¸æ¸…理¾~“å­˜
      4)FlushMode.ALWAYS 在每一个查询语句前都调用flush()æ–ÒŽ³•˜q›è¡Œ¾~“存清理.
对象的äÍ时状æ€?刚用new创徏对象的时å€?它还没有被持久化,˜q™ä¸ªæ—¶å€™æ˜¯ä¸´æ—¶çжæ€?
对象的持久化状æ€?已经被加入到Session的缓存中,通常所说的持久化对象就是只一个对象在˜q™ä¸ªçŠ¶æ€çš„æ—¶å€?
对象的游¼›ÈŠ¶æ€?已经被持久化,但是不属于Session的缓存的时候是游离状æ€?



]]>
应用Hibernate3çš„DetachedCriteria实现分页查询 http://www.aygfsteel.com/keweibo/articles/154776.htmlKeKeSun, 21 Oct 2007 13:51:00 GMThttp://www.aygfsteel.com/keweibo/articles/154776.htmlhttp://www.aygfsteel.com/keweibo/comments/154776.htmlhttp://www.aygfsteel.com/keweibo/articles/154776.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/154776.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/154776.htmlHibernate3提供了DetachedCriteriaåQŒä‹É得我们可以在Web层构造detachedCriteriaåQŒç„¶åŽè°ƒç”¨ä¸šåС层BeanåQŒè¿›è¡ŒåŠ¨æ€æ¡ä»¶æŸ¥è¯¢ï¼Œæ ÒŽ®˜q™ä¸€åŠŸèƒ½åQŒæˆ‘设计了通用的抽象Bean基类和分™å늱»æ”¯æŒåQŒä»£ç æ¥è‡ªäºŽQuake Wangçš„javaeye-core包的相应¾c»ï¼Œç„¶åŽåˆåšäº†å¾ˆå¤šä¿®æ”V€?/p>

分页支持¾c»ï¼š

java 代码
  1. package com.javaeye.common.util;   
  2.   
  3. import java.util.List;   
  4.   
  5. public class PaginationSupport {   
  6.   
  7.     public final static int PAGESIZE = 30;   
  8.   
  9.     private int pageSize = PAGESIZE;   
  10.   
  11.     private List items;   
  12.   
  13.     private int totalCount;   
  14.   
  15.     private int[] indexes = new int[0];   
  16.   
  17.     private int startIndex = 0;   
  18.   
  19.     public PaginationSupport(List items, int totalCount) {   
  20.         setPageSize(PAGESIZE);   
  21.                 setTotalCount(totalCount);   
  22.         setItems(items);           
  23.         setStartIndex(0);   
  24.     }   
  25.   
  26.     public PaginationSupport(List items, int totalCount, int startIndex) {   
  27.                 setPageSize(PAGESIZE);   
  28.         setTotalCount(totalCount);   
  29.         setItems(items);           
  30.         setStartIndex(startIndex);   
  31.     }   
  32.   
  33.     public PaginationSupport(List items, int totalCount, int pageSize, int startIndex) {   
  34.                 setPageSize(pageSize);   
  35.         setTotalCount(totalCount);   
  36.         setItems(items);   
  37.         setStartIndex(startIndex);   
  38.     }   
  39.   
  40.     public List getItems() {   
  41.         return items;   
  42.     }   
  43.   
  44.     public void setItems(List items) {   
  45.         this.items = items;   
  46.     }   
  47.   
  48.     public int getPageSize() {   
  49.         return pageSize;   
  50.     }   
  51.   
  52.     public void setPageSize(int pageSize) {   
  53.         this.pageSize = pageSize;   
  54.     }   
  55.   
  56.     public int getTotalCount() {   
  57.         return totalCount;   
  58.     }   
  59.   
  60.     public void setTotalCount(int totalCount) {   
  61.         if (totalCount > 0) {   
  62.             this.totalCount = totalCount;   
  63.             int count = totalCount / pageSize;   
  64.             if (totalCount % pageSize > 0)   
  65.                 count++;   
  66.             indexes = new int[count];   
  67.             for (int i = 0; i < count; i++) {   
  68.                 indexes[i] = pageSize * i;   
  69.             }   
  70.         } else {   
  71.             this.totalCount = 0;   
  72.         }   
  73.     }   
  74.   
  75.     public int[] getIndexes() {   
  76.         return indexes;   
  77.     }   
  78.   
  79.     public void setIndexes(int[] indexes) {   
  80.         this.indexes = indexes;   
  81.     }   
  82.   
  83.     public int getStartIndex() {   
  84.         return startIndex;   
  85.     }   
  86.   
  87.     public void setStartIndex(int startIndex) {   
  88.         if (totalCount <= 0)   
  89.             this.startIndex = 0;   
  90.         else if (startIndex >= totalCount)   
  91.             this.startIndex = indexes[indexes.length - 1];   
  92.         else if (startIndex < 0)   
  93.             this.startIndex = 0;   
  94.         else {   
  95.             this.startIndex = indexes[startIndex / pageSize];   
  96.         }   
  97.     }   
  98.   
  99.     public int getNextIndex() {   
  100.         int nextIndex = getStartIndex() + pageSize;   
  101.         if (nextIndex >= totalCount)   
  102.             return getStartIndex();   
  103.         else  
  104.             return nextIndex;   
  105.     }   
  106.   
  107.     public int getPreviousIndex() {   
  108.         int previousIndex = getStartIndex() - pageSize;   
  109.         if (previousIndex < 0)   
  110.             return 0;   
  111.         else  
  112.             return previousIndex;   
  113.     }   
  114.   
  115. }  

 

抽象业务¾c?

java 代码
  1. /**  
  2.  * Created on 2005-7-12  
  3.  */  
  4. package com.javaeye.common.business;   
  5.   
  6. import java.io.Serializable;   
  7. import java.util.List;   
  8.   
  9. import org.hibernate.Criteria;   
  10. import org.hibernate.HibernateException;   
  11. import org.hibernate.Session;   
  12. import org.hibernate.criterion.DetachedCriteria;   
  13. import org.hibernate.criterion.Projections;   
  14. import org.springframework.orm.hibernate3.HibernateCallback;   
  15. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
  16.   
  17. import com.javaeye.common.util.PaginationSupport;   
  18.   
  19. public abstract class AbstractManager extends HibernateDaoSupport {   
  20.   
  21.     private boolean cacheQueries = false;   
  22.   
  23.     private String queryCacheRegion;   
  24.   
  25.     public void setCacheQueries(boolean cacheQueries) {   
  26.         this.cacheQueries = cacheQueries;   
  27.     }   
  28.   
  29.     public void setQueryCacheRegion(String queryCacheRegion) {   
  30.         this.queryCacheRegion = queryCacheRegion;   
  31.     }   
  32.   
  33.     public void save(final Object entity) {   
  34.         getHibernateTemplate().save(entity);   
  35.     }   
  36.   
  37.     public void persist(final Object entity) {   
  38.         getHibernateTemplate().save(entity);   
  39.     }   
  40.   
  41.     public void update(final Object entity) {   
  42.         getHibernateTemplate().update(entity);   
  43.     }   
  44.   
  45.     public void delete(final Object entity) {   
  46.         getHibernateTemplate().delete(entity);   
  47.     }   
  48.   
  49.     public Object load(final Class entity, final Serializable id) {   
  50.         return getHibernateTemplate().load(entity, id);   
  51.     }   
  52.   
  53.     public Object get(final Class entity, final Serializable id) {   
  54.         return getHibernateTemplate().get(entity, id);   
  55.     }   
  56.   
  57.     public List findAll(final Class entity) {   
  58.         return getHibernateTemplate().find("from " + entity.getName());   
  59.     }   
  60.   
  61.     public List findByNamedQuery(final String namedQuery) {   
  62.         return getHibernateTemplate().findByNamedQuery(namedQuery);   
  63.     }   
  64.   
  65.     public List findByNamedQuery(final String query, final Object parameter) {   
  66.         return getHibernateTemplate().findByNamedQuery(query, parameter);   
  67.     }   
  68.   
  69.     public List findByNamedQuery(final String query, final Object[] parameters) {   
  70.         return getHibernateTemplate().findByNamedQuery(query, parameters);   
  71.     }   
  72.   
  73.     public List find(final String query) {   
  74.         return getHibernateTemplate().find(query);   
  75.     }   
  76.   
  77.     public List find(final String query, final Object parameter) {   
  78.         return getHibernateTemplate().find(query, parameter);   
  79.     }   
  80.   
  81.     public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria) {   
  82.         return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, 0);   
  83.     }   
  84.   
  85.     public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int startIndex) {   
  86.         return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, startIndex);   
  87.     }   
  88.   
  89.     public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int pageSize,   
  90.             final int startIndex) {   
  91.         return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() {   
  92.             public Object doInHibernate(Session session) throws HibernateException {   
  93.                 Criteria criteria = detachedCriteria.getExecutableCriteria(session);   
  94.                 int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();   
  95.                 criteria.setProjection(null);   
  96.                 List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
  97.                 PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex);   
  98.                 return ps;   
  99.             }   
  100.         }, true);   
  101.     }   
  102.   
  103.     public List findAllByCriteria(final DetachedCriteria detachedCriteria) {   
  104.         return (List) getHibernateTemplate().execute(new HibernateCallback() {   
  105.             public Object doInHibernate(Session session) throws HibernateException {   
  106.                 Criteria criteria = detachedCriteria.getExecutableCriteria(session);   
  107.                 return criteria.list();   
  108.             }   
  109.         }, true);   
  110.     }   
  111.   
  112.     public int getCountByCriteria(final DetachedCriteria detachedCriteria) {   
  113.         Integer count = (Integer) getHibernateTemplate().execute(new HibernateCallback() {   
  114.             public Object doInHibernate(Session session) throws HibernateException {   
  115.                 Criteria criteria = detachedCriteria.getExecutableCriteria(session);   
  116.                 return criteria.setProjection(Projections.rowCount()).uniqueResult();   
  117.             }   
  118.         }, true);   
  119.         return count.intValue();   
  120.     }   
  121. }   

 

用户在web层构造查询条件detachedCriteriaåQŒå’Œå¯é€‰çš„startIndexåQŒè°ƒç”¨ä¸šåŠ¡bean的相应findByCriteriaæ–ÒŽ³•åQŒè¿”回一个PaginationSupport的实例psã€?/p>

ps.getItems()得到已分™åµå¥½çš„结果集
ps.getIndexes()得到分页索引的数¾l?
ps.getTotalCount()得到æ€È»“果数
ps.getStartIndex()当前分页索引
ps.getNextIndex()下一™å늃¦å¼?
ps.getPreviousIndex()上一™å늃¦å¼?br />
文章出处:http://www.javaeye.com/topic/14657



]]>
Hibernate Criteriahttp://www.aygfsteel.com/keweibo/articles/152160.htmlKeKeThu, 11 Oct 2007 14:13:00 GMThttp://www.aygfsteel.com/keweibo/articles/152160.htmlhttp://www.aygfsteel.com/keweibo/comments/152160.htmlhttp://www.aygfsteel.com/keweibo/articles/152160.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/152160.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/152160.htmlå…ähœ‰ä¸€ä¸ªç›´è§‚的、可扩展的条件查询API是Hibernate的特艌Ӏ?nbsp;   
  •   
  • 15.1. åˆ›å¾ä¸€ä¸ªCriteria å®žä¾‹   
  • org.hibernate.Criteria接口表示特定持久¾cȝš„一个查询。Sessionæ˜?nbsp;Criteria实例的工厂ã€?nbsp;   
  •   
  • Criteria crit = sess.createCriteria(Cat.class);   
  • crit.setMaxResults(50);   
  • List cats = crit.list();   
  • 15.2. é™åˆ¶¾l“果集内å®?  
  • 一个单独的查询条äšg是org.hibernate.criterion.Criterion æŽ¥å£çš„一个实例。org.hibernate.criterion.Restrictions¾c?nbsp;定义了获得某些内¾|®Criterion¾cÕdž‹çš„工厂方法ã€?nbsp;   
  •   
  • List cats = sess.createCriteria(Cat.class)   
  •     .add( Restrictions.like("name""Fritz%") )   
  •     .add( Restrictions.between("weight", minWeight, maxWeight) )   
  •     .list();   
  • ¾U¦æŸå¯ä»¥æŒ‰é€»è¾‘分组ã€?nbsp;   
  •   
  • List cats = sess.createCriteria(Cat.class)   
  •     .add( Restrictions.like("name""Fritz%") )   
  •     .add( Restrictions.or(   
  •         Restrictions.eq( "age"new Integer(0) ),   
  •         Restrictions.isNull("age")   
  •     ) )   
  •     .list();   
  • List cats = sess.createCriteria(Cat.class)   
  •     .add( Restrictions.in( "name"new String[] { "Fritz""Izi""Pk" } ) )   
  •     .add( Restrictions.disjunction()   
  •         .add( Restrictions.isNull("age") )   
  •      .add( Restrictions.eq("age"new Integer(0) ) )   
  •      .add( Restrictions.eq("age"new Integer(1) ) )   
  •      .add( Restrictions.eq("age"new Integer(2) ) )   
  •     ) )   
  •     .list();   
  • Hibernate提供了相当多的内¾|®criterion¾cÕdž‹(Restrictions å­ç±»), ä½†æ˜¯ž®¤å…¶æœ‰ç”¨çš„æ˜¯å¯ä»¥å…è®¸ä½ ç›´æŽ¥ä‹É用SQLã€?nbsp;   
  •   
  • List cats = sess.createCriteria(Cat.class)   
  •     .add( Restrictions.sql("lower({alias}.name) like lower(?)""Fritz%", Hibernate.STRING) )   
  •     .list();   
  • {alias}占位½W¦åº”å½“è¢«æ›¿æ¢ä¸ø™¢«æŸ¥è¯¢å®žä½“的列别名ã€?nbsp;   
  •   
  • Property实例是获得一个条件的另外一¿Ué€”径。你可以通过调用Property.forName() åˆ›å¾ä¸€ä¸ªPropertyã€?nbsp;   
  •   
  • Property age = Property.forName("age");   
  • List cats = sess.createCriteria(Cat.class)   
  •     .add( Restrictions.disjunction()   
  •         .add( age.isNull() )   
  •      .add( age.eq( new Integer(0) ) )   
  •      .add( age.eq( new Integer(1) ) )   
  •      .add( age.eq( new Integer(2) ) )   
  •     ) )   
  •     .add( Property.forName("name").in( new String[] { "Fritz""Izi""Pk" } ) )   
  •     .list();   
  • 15.3. ¾l“果集排åº?  
  • 你可以ä‹É用org.hibernate.criterion.Orderæ¥äØ“æŸ¥è¯¢¾l“果排序ã€?nbsp;   
  •   
  • List cats = sess.createCriteria(Cat.class)   
  •     .add( Restrictions.like("name""F%")   
  •     .addOrder( Order.asc("name") )   
  •     .addOrder( Order.desc("age") )   
  •     .setMaxResults(50)   
  •     .list();   
  • List cats = sess.createCriteria(Cat.class)   
  •     .add( Property.forName("name").like("F%") )   
  •     .addOrder( Property.forName("name").asc() )   
  •     .addOrder( Property.forName("age").desc() )   
  •     .setMaxResults(50)   
  •     .list();   
  • 15.4. å…Œ™”   
  • 你可以ä‹É用createCriteria()非常å®ÒŽ˜“的在互相兌™”的实体间建立 ¾U¦æŸã€?nbsp;   
  •   
  • List cats = sess.createCriteria(Cat.class)   
  •     .add( Restrictions.like("name""F%")   
  •     .createCriteria("kittens")   
  •         .add( Restrictions.like("name""F%")   
  •     .list();   
  • 注意½W¬äºŒä¸?nbsp;createCriteria()˜q”回一个新çš?nbsp;Criteria实例åQŒè¯¥å®žä¾‹å¼•用kittens é›†åˆä¸­çš„元素ã€?nbsp;   
  •   
  • 接下来,替换形态在某些情况下也是很有用的ã€?nbsp;   
  •   
  • List cats = sess.createCriteria(Cat.class)   
  •     .createAlias("kittens""kt")   
  •     .createAlias("mate""mt")   
  •     .add( Restrictions.eqProperty("kt.name""mt.name") )   
  •     .list();   
  • (createAlias()òq¶ä¸åˆ›å¾ä¸€ä¸ªæ–°çš?nbsp;Criteria实例ã€?    
  •   
  • Cat实例所保存的之前两‹Æ¡æŸ¥è¯¢æ‰€˜q”回的kittens集合æ˜?nbsp;没有被条仉™¢„˜q‡æ×o的。如果你希望只获得符合条件的kittensåQ?nbsp;ä½ å¿…™åÖM‹É用returnMaps()ã€?nbsp;   
  •   
  • List cats = sess.createCriteria(Cat.class)   
  •     .createCriteria("kittens""kt")   
  •         .add( Restrictions.eq("name""F%") )   
  •     .returnMaps()   
  •     .list();   
  • Iterator iter = cats.iterator();   
  • while ( iter.hasNext() ) {   
  •     Map map = (Map) iter.next();   
  •     Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);   
  •     Cat kitten = (Cat) map.get("kt");   
  • }   
  • 15.5. åŠ¨æ€å…³è”æŠ“å?  
  • 你可以ä‹É用setFetchMode()在运行时定义动态关联抓取的语义ã€?nbsp;   
  •   
  • List cats = sess.createCriteria(Cat.class)   
  •     .add( Restrictions.like("name""Fritz%") )   
  •     .setFetchMode("mate", FetchMode.EAGER)   
  •     .setFetchMode("kittens", FetchMode.EAGER)   
  •     .list();   
  • ˜q™ä¸ªæŸ¥è¯¢å¯ä»¥é€šè¿‡å¤–连接抓取mateå’Œkittensã€?nbsp;查看½W?nbsp;19.1 èŠ?nbsp;“ æŠ“取½{–ç•¥(Fetching strategies) ”可以获得更多信息ã€?nbsp;   
  •   
  • 15.6. æŸ¥è¯¢½CÞZ¾‹   
  • org.hibernate.criterion.Example¾cÕd…è®æ€½ é€šè¿‡ä¸€ä¸ªç»™å®šå®žä¾?nbsp;构徏一个条件查询ã€?nbsp;   
  •   
  • Cat cat = new Cat();   
  • cat.setSex('F');   
  • cat.setColor(Color.BLACK);   
  • List results = session.createCriteria(Cat.class)   
  •     .add( Example.create(cat) )   
  •     .list();   
  • 版本属性、标识符和关联被忽略。默认情况下å€égØ“null的属性将被排除ã€?nbsp;   
  •   
  • 你可以自行调整Example使之更实用ã€?nbsp;   
  •   
  • Example example = Example.create(cat)   
  •     .excludeZeroes()           //exclude zero valued properties   
  •     .excludeProperty("color")  //exclude the property named "color"   
  •     .ignoreCase()              //perform case insensitive string comparisons   
  •     .enableLike();             //use like for string comparisons   
  • List results = session.createCriteria(Cat.class)   
  •     .add(example)   
  •     .list();   
  • 你甚臛_¯ä»¥ä‹É用examples在关联对象上攄¡½®æ¡äšgã€?nbsp;   
  •   
  • List results = session.createCriteria(Cat.class)   
  •     .add( Example.create(cat) )   
  •     .createCriteria("mate")   
  •         .add( Example.create( cat.getMate() ) )   
  •     .list();   
  • 15.7. æŠ•媄(Projections)、聚合(aggregationåQ‰å’Œåˆ†ç»„åQˆgroupingåQ?  
  • org.hibernate.criterion.Projectionsæ˜?nbsp;Projection çš„实例工厂。我们通过调用 setProjection()应用投媄åˆîC¸€ä¸ªæŸ¥è¯¢ã€?nbsp;   
  •   
  • List results = session.createCriteria(Cat.class)   
  •     .setProjection( Projections.rowCount() )   
  •     .add( Restrictions.eq("color", Color.BLACK) )   
  •     .list();   
  • List results = session.createCriteria(Cat.class)   
  •     .setProjection( Projections.projectionList()   
  •         .add( Projections.rowCount() )   
  •         .add( Projections.avg("weight") )   
  •         .add( Projections.max("weight") )   
  •         .add( Projections.groupProperty("color") )   
  •     )   
  •     .list();   
  • 在一个条件查询中没有必要昑ּçš„ä‹Éç”?nbsp;"group by" ã€‚某些投å½Þq±»åž‹å°±æ˜¯è¢«å®šä¹‰ä¸?nbsp;分组投媄åQŒä»–们也出现在SQLçš„group by子句中ã€?nbsp;   
  •   
  • 你可以选择把一个别名指‹z„¡»™ä¸€ä¸ªæŠ•影,˜q™æ ·å¯ä»¥ä½¿æŠ•影倯D¢«¾U¦æŸæˆ–排序所引用。下面是两种不同的实现方式:    
  •   
  • List results = session.createCriteria(Cat.class)   
  •     .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )   
  •     .addOrder( Order.asc("colr") )   
  •     .list();   
  • List results = session.createCriteria(Cat.class)   
  •     .setProjection( Projections.groupProperty("color").as("colr") )   
  •     .addOrder( Order.asc("colr") )   
  •     .list();   
  • alias()å’Œas()æ–ÒŽ³•½Ž€ä¾¿çš„ž®†ä¸€ä¸ªæŠ•影实例包装到另外一ä¸?nbsp;别名的Projection实例中。简而言之,当你æ·ÕdŠ ä¸€ä¸ªæŠ•å½±åˆ°ä¸€ä¸ªæŠ•å½±åˆ—è¡¨ä¸­æ—?nbsp;ä½ å¯ä»¥äØ“å®ƒæŒ‡å®šä¸€ä¸ªåˆ«åï¼š    
  •   
  • List results = session.createCriteria(Cat.class)   
  •     .setProjection( Projections.projectionList()   
  •         .add( Projections.rowCount(), "catCountByColor" )   
  •         .add( Projections.avg("weight"), "avgWeight" )   
  •         .add( Projections.max("weight"), "maxWeight" )   
  •         .add( Projections.groupProperty("color"), "color" )   
  •     )   
  •     .addOrder( Order.desc("catCountByColor") )   
  •     .addOrder( Order.desc("avgWeight") )   
  •     .list();   
  • List results = session.createCriteria(Domestic.class"cat")   
  •     .createAlias("kittens""kit")   
  •     .setProjection( Projections.projectionList()   
  •         .add( Projections.property("cat.name"), "catName" )   
  •         .add( Projections.property("kit.name"), "kitName" )   
  •     )   
  •     .addOrder( Order.asc("catName") )   
  •     .addOrder( Order.asc("kitName") )   
  •     .list();   
  • 你也可以使用Property.forName()来表½CºæŠ•影:    
  •   
  • List results = session.createCriteria(Cat.class)   
  •     .setProjection( Property.forName("name") )   
  •     .add( Property.forName("color").eq(Color.BLACK) )   
  •     .list();   
  • List results = session.createCriteria(Cat.class)   
  •     .setProjection( Projections.projectionList()   
  •         .add( Projections.rowCount().as("catCountByColor") )   
  •         .add( Property.forName("weight").avg().as("avgWeight") )   
  •         .add( Property.forName("weight").max().as("maxWeight") )   
  •         .add( Property.forName("color").group().as("color" )   
  •     )   
  •     .addOrder( Order.desc("catCountByColor") )   
  •     .addOrder( Order.desc("avgWeight") )   
  •     .list();   
  • 15.8. ¼›Èº¿(detached)查询和子查询   
  • DetachedCriteria¾cÖM‹É你在一个session范围之外创徏一个查询,òq¶ä¸”可以使用ä»ÀL„çš?nbsp;Session来执行它ã€?nbsp;   
  •   
  • DetachedCriteria query = DetachedCriteria.forClass(Cat.class)   
  •     .add( Property.forName("sex").eq('F') );   
  •        
  • Session session = ....;   
  • Transaction txn = session.beginTransaction();   
  • List results = query.getExecutableCriteria(session).setMaxResults(100).list();   
  • txn.commit();   
  • session.close();   
  • DetachedCriteria也可以用以表½Cºå­æŸ¥è¯¢ã€‚条件实例包含子查询可以通过 Subqueries或者Property获得ã€?nbsp;   
  •   
  • DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)   
  • .setProjection( Property.forName("weight").avg() );   
  • session.createCriteria(Cat.class)   
  • .add( Property.forName("weight).gt(avgWeight) )  
  • .list();  
  • DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)  
  • .setProjection( Property.forName("weight") );  
  • session.createCriteria(Cat.class)  
  • .add( Subqueries.geAll("weight", weights) )  
  • .list();  
  • ç”šè‡³ç›æ€º’å…Œ™”的子查询也是有可能的åQ?nbsp;  
  •  
  • DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")  
  • .setProjection( Property.forName("weight").avg() )  
  • .add( Property.forName("cat2.sex").eqProperty("cat.sex") );  
  • session.createCriteria(Cat.class, "cat")  
  • .add( Property.forName("weight).gt(avgWeightForSex) )   
  • .list();   
  •     
  •   
  •  //具体应用   
  •   
  • 把HSQL语句用Criteria代替åQŒæ„Ÿè§‰æ›´åŠ ç¾Žè§‚ä¸€ç‚¹ï¼Œè€Œä¸”˜q˜æ”¯æŒä¸­æ–‡ï¼Œè¦æ˜¯HSQLæƒÏx”¯æŒä¸­æ–‡ï¼Œä½ å¾—使用占位½W¦æ¥è®„¡½®åQŒå…·ä½“可参照åQšhttp://.blogdriver.com//983190.html   
  •   
  • 那么Criteria的用法是˜q™æ ·çš„:   
  •   
  •     public Collection findCriteria(final DetachedCriteria dc, final IPage page) {   
  •         return (List) getHibernateTemplate().execute(new HibernateCallback(){   
  •             public Object doInHibernate(Session session) throws HibernateException, SQLException {   
  •                 Criteria c = dc.getExecutableCriteria(session);   
  •                    
  •                 page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());    
  •                 c.setProjection(null);    
  •                 c.setResultTransformer(Criteria.ROOT_ENTITY);   
  •                 c.setFirstResult(page.getBeginIndex());   
  •                 c.setMaxResults(page.getPageSize());   
  •                 return c.list();   
  •             }   
  •         }, true);   
  •     }   
  •   
  • 其中的参æ•?/span>true表示要Spring强制传入SessionImplåQŒè€Œä¸æ˜¯ä¼ å…¥Proxy代理¾c»ï¼Œpage.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());    
  • c.setProjection(null); ç›®çš„æ˜¯äؓ了获得行敎ͼŒòq¶è®¾¾|®æŠ•å½×ƒØ“½Iºï¼Œä¸ºçš„æ˜¯è¿”回List出来åQŒå¦‚果不讄¡½®setProjection(null)的话åQŒc.listž®†è¿”回的是行æ•?intåž?åQŒè€Œä¸æ˜¯æ‰€è¦æŸ¥è¯¢çš„æ•°æ®åº“信息。但是Criteriaçš„ResultTransformer会变成PassThroughResultTransformeråQŒcriteria.list的时候可能结果会跟理想的不一栗÷€‚所以我们还要再c.setResultTransformer(Criteria.ROOT_ENTITY);把结果以Entityçš„åŞ式返回,而不是Object[]çš„åŞ式返回。具体的ResultTransformer可以google一下ã€?  
  •   
  • ‹¹‹è¯•代码如下åQ?  
  •   
  •     public void testCriteria() {   
  •         DetachedCriteria dc = DetachedCriteria.forClass(User.class);   
  •         dc.add(Restrictions.eq("name""user")).add(Restrictions.like("description""%ä¸È®¡äººå‘˜%"));   
  •         IPage page = new Page();   
  •         page.setCurrentPage(1);   
  •         page.setPageSize(10);   
  •         Collection list = _userDAO.findCriteria(dc, page);   
  •         assertNotNull(list);   
  •         assertEquals(1, list.size());   
  •     }   
  •   
  • 来源åQšhttp://aimtime812110.spaces.msn.com/Blog/cns!1pXyGS-D6ufSs-1GPdk-fkiQ!108.entry   


  • ]]>
    HibernateTemplate的常规用æ³?/title><link>http://www.aygfsteel.com/keweibo/articles/150094.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 01 Oct 2007 11:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/150094.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/150094.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/150094.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/150094.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/150094.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; line-height: 15.7pt">HibernateTemplate<span style="font-family: 宋体">提供非常多的常用æ–ÒŽ³•来完成基本的操作åQŒæ¯”如通常的增加、删除、修攏V€æŸ¥è¯¢ç­‰æ“ä½œåQ?/span>Spring 2.0<span style="font-family: 宋体">更增加对命名</span>SQL<span style="font-family: 宋体">查询的支持,也增加对分页的支持。大部分情况下,使用</span>Hibernate<span style="font-family: 宋体">的常规用法,ž®±å¯å®Œæˆå¤§å¤šæ•?/span>DAO<span style="font-family: 宋体">对象çš?/span>CRUD<span style="font-family: 宋体">操作。下面是</span>HibernateTemplate<span style="font-family: 宋体">的常用方法简介:</span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>void delete(Object entity)<span style="font-family: 宋体">åQšåˆ é™¤æŒ‡å®šæŒä¹…化实例</span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>deleteAll(Collection entities)<span style="font-family: 宋体">åQšåˆ é™¤é›†åˆå†…全部持久化类实例</span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>find(String queryString)<span style="font-family: 宋体">åQšæ ¹æ?/span>HQL<span style="font-family: 宋体">查询字符串来˜q”回实例集合</span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>findByNamedQuery(String queryName)<span style="font-family: 宋体">åQšæ ¹æ®å‘½åæŸ¥è¯¢è¿”å›žå®žä¾‹é›†å?/span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>get(Class entityClass, Serializable id)<span style="font-family: 宋体">åQšæ ¹æ®ä¸»é”®åŠ è½½ç‰¹å®šæŒä¹…åŒ–¾cȝš„实例</span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>save(Object entity)<span style="font-family: 宋体">åQšä¿å­˜æ–°çš„实ä¾?/span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>saveOrUpdate(Object entity)<span style="font-family: 宋体">åQšæ ¹æ®å®žä¾‹çŠ¶æ€ï¼Œé€‰æ‹©ä¿å­˜æˆ–è€…æ›´æ–?/span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>update(Object entity)<span style="font-family: 宋体">åQšæ›´æ–°å®žä¾‹çš„çŠ¶æ€ï¼Œè¦æ±‚</span>entity<span style="font-family: 宋体">是持久状æ€?/span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>setMaxResults(int maxResults)<span style="font-family: 宋体">åQšè®¾¾|®åˆ†™å늚„大小</span></p> <p style="margin-left: 21.25pt; text-indent: 0cm"><span style="font-family: 宋体">下面是一个完æ•?/span>DAO<span style="font-family: 宋体">¾cÈš„æºä»£ç ï¼š</span></p> <p>public class PersonDAOHibernate implements PersonDAO</p> <p>{</p> <p style="text-align: left" align="left">    //<span style="font-family: 黑体">采用</span>log4j<span style="font-family: 黑体">来完成调试时的日志功èƒ?/span></p> <p style="text-indent: 21pt">private static Log log = LogFactory.getLog(NewsDAOHibernate.class);</p> <p>    //<span style="font-family: 黑体">以私有的成员变量来保å­?/span>SessionFactory<span style="font-family: 黑体">ã€?/span></p> <p style="text-indent: 21pt">private SessionFactory sessionFactory;</p> <p style="text-indent: 21pt">//<span style="font-family: 黑体">以私有变量的方式保存</span>HibernateTemplate</p> <p style="text-indent: 21pt">private HibernateTemplate hibernateTemplate = null;</p> <p>         //<span style="font-family: 黑体">讑ր¼æ³¨å…?/span>SessionFactory<span style="font-family: 黑体">必需çš?/span>setter<span style="font-family: 黑体">æ–ÒŽ³•</span></p> <p>    public void setSessionFactory(SessionFactory sessionFactory) </p> <p style="text-indent: 21pt">{</p> <p>           this.sessionFactory = sessionFactory;</p> <p>    }</p> <p>         //<span style="font-family: 黑体">初始化本</span>DAO<span style="font-family: 黑体">所需çš?/span>HibernateTemplate</p> <p style="text-indent: 21pt">public HIbernateTemplate getHibernateTemplate() </p> <p style="text-indent: 21pt">{</p> <p style="text-indent: 21pt">         //<span style="font-family: 黑体">首先åQŒæ£€æŸ¥åŽŸæ¥çš„</span>hibernateTemplate<span style="font-family: 黑体">实例是否˜q˜å­˜åœ?/span></p> <p style="text-indent: 21pt">         if ( hibernateTemplate == null)</p> <p style="text-indent: 21pt">         {</p> <p style="text-indent: 21pt">                   //<span style="font-family: 黑体">如果不存在,新徏一ä¸?/span>HibernateTemplate<span style="font-family: 黑体">实例</span></p> <p style="text-indent: 21pt">                   hibernateTemplate = new HibernateTemplate(sessionFactory);</p> <p style="text-indent: 21pt">         }</p> <p style="text-indent: 21pt">         return hibernateTemplate;</p> <p style="text-indent: 21pt">}</p> <p>         //<span style="font-family: 黑体">˜q”回全部的äh的实ä¾?/span></p> <p>    public List getPersons()</p> <p>         {        </p> <p>                   //<span style="font-family: 黑体">通过</span>HibernateTemplate<span style="font-family: 黑体">çš?/span>find<span style="font-family: 黑体">æ–ÒŽ³•˜q”回</span>Person<span style="font-family: 黑体">的全部实ä¾?/span></p> <p>           return getHibernateTemplate().find("from Person");</p> <p>    }</p> <p>         /**</p> <p>          * <span style="font-family: 黑体">æ ÒŽ®ä¸»é”®˜q”回特定实例</span></p> <p>          * @ return <span style="font-family: 黑体">特定主键对应çš?/span>Person<span style="font-family: 黑体">实例</span></p> <p>          * @ param <span style="font-family: 黑体">主键å€?/span></p> <p>    public News getNews(int personid)</p> <p>         {</p> <p>           return (Person)getHibernateTemplate().get(Person.class, new Integer(personid));</p> <p>    }</p> <p>         /**</p> <p>          * @ person <span style="font-family: 黑体">需要保存的</span>Person<span style="font-family: 黑体">实例</span></p> <p>          */</p> <p>    public void savePerson(Person person)</p> <p>         {                 </p> <p>                   getHibernateTemplate().saveOrUpdate(person);</p> <p>    }</p> <p>         /**</p> <p>          * @ param personid <span style="font-family: 黑体">需要删é™?/span>Person<span style="font-family: 黑体">实例的主é”?/span></p> <p>          * /</p> <p>    public void removePerson(int personid)</p> <p>         {</p> <p>                   //<span style="font-family: 黑体">先加载特定实ä¾?/span></p> <p>           Object p = getHibernateTemplate().load(Person.class, new Integer(personid));</p> <p>                   //<span style="font-family: 黑体">删除特定实例</span></p> <p>           getHibernateTemplate().delete(p);</p> <p>    }</p> <p>}</p> <img src ="http://www.aygfsteel.com/keweibo/aggbug/150094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2007-10-01 19:55 <a href="http://www.aygfsteel.com/keweibo/articles/150094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Hibernate的复杂用法HibernateCallbackhttp://www.aygfsteel.com/keweibo/articles/150093.htmlKeKeMon, 01 Oct 2007 11:54:00 GMThttp://www.aygfsteel.com/keweibo/articles/150093.htmlhttp://www.aygfsteel.com/keweibo/comments/150093.htmlhttp://www.aygfsteel.com/keweibo/articles/150093.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/150093.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/150093.htmlHibernateTemplate˜q˜æä¾›ä¸€¿Uæ›´åŠ çµ‹zÈš„æ–¹å¼æ¥æ“ä½œæ•°æ®åº“åQŒé€šè¿‡˜q™ç§æ–¹å¼å¯ä»¥å®Œå…¨ä½¿ç”¨Hibernate的操作方式ã€?/span>HibernateTemplate的灵‹z»è®¿é—®æ–¹å¼æ˜¯é€šè¿‡å¦‚下两个æ–ÒŽ³•完成åQ?/span>

    q      Object execute(HibernateCallback action)

    q      List execute(HibernateCallback action)

    ˜q™ä¸¤ä¸ªæ–¹æ³•都需要一ä¸?/span>HibernateCallback的实例,HibernateCallback实例可在ä»ÖM½•有效çš?/span>Hibernate数据讉K—®ä¸­ä‹É用。程序开发者通过HibernateCallbackåQŒå¯ä»¥å®Œå…¨ä‹Éç”?/span>Hibernate灉|´»çš„æ–¹å¼æ¥è®‰K—®æ•°æ®åº“,解决Springž®è£…Hibernate后灵‹zÀL€§ä¸­‘³çš„¾~ºé™·ã€?/span>HibernateCallback是一个接口,该接口只有一个方æ³?/span>doInHibernate(org.hibernate.Session session)åQŒè¯¥æ–ÒŽ³•只有一个参æ•?/span>Sessionã€?/span>

    通常åQŒç¨‹åºä¸­é‡‡ç”¨å®žçްHibernateCallback的匿名内部类来获å?/span>HibernateCallback的实例,æ–ÒŽ³•doInHibernate的方法体ž®±æ˜¯Spring执行的持久化操作。具体代码如下:

    public class PersonDaoImpl implements PersonDao

    {

        //¿Uæœ‰å®žä¾‹å˜é‡ä¿å­˜SessionFactory

             private SessionFactory sessionFactory;

             //依赖注入必须çš?/span>setteræ–ÒŽ³•

        public void setSessionFactory(SessionFactory sessionFactory)

             {

               this.sessionFactory = sessionFactory;

        }

             /**

              * 通过人名查找所有匹配该名的Person实例

              * @param name 匚w…çš„ähå?/span>

              * @return 匚w…è¯¥ä“Q命的全部Person集合

              */

        public List findPersonsByName(final String name)

             {

               //创徏HibernateTemplate实例

                       HibernateTemplate hibernateTemplate =

                             new HibernateTemplate(this.sessionFactory);

               //˜q”回HibernateTemplateçš?/span>execute的结æž?/span>

                       return (List) hibernateTemplate.execute(

                    //创徏匿名内部¾c?/span>

                       new HibernateCallback()

                       {

                  public Object doInHibernate(Session session) throws HibernateException

                                {

                       //使用条äšg查询的方法返å›?/span>

                                         List result = session.createCriteria(Person.class)

                                                                         .add(Restrictions.like(“name”, name+”%”)

                                                                               .list();

                                        return result;

                         }

                    });

        }

    }

    注意åQšæ–¹æ³?/span>doInHibernateæ–ÒŽ³•内可以访é—?/span>SessionåQŒè¯¥Session对象是绑定到该线½E‹çš„Session实例。该æ–ÒŽ³•内的持久层操作,与不使用Spring时的持久层操作完全相同。这保证对于复杂的持久层讉K—®åQŒä¾ç„¶å¯ä»¥ä‹Éç”?/span>Hibernate的访问方式ã€?/span>



    ]]>
    Hibernate3.x调用存储˜q‡ç¨‹ http://www.aygfsteel.com/keweibo/articles/145983.htmlKeKeMon, 17 Sep 2007 14:09:00 GMThttp://www.aygfsteel.com/keweibo/articles/145983.htmlhttp://www.aygfsteel.com/keweibo/comments/145983.htmlhttp://www.aygfsteel.com/keweibo/articles/145983.html#Feedback2http://www.aygfsteel.com/keweibo/comments/commentRss/145983.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/145983.html阅读全文

    ]]>
    Hibernate的检索策ç•?/title><link>http://www.aygfsteel.com/keweibo/articles/145535.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sun, 16 Sep 2007 06:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/145535.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/145535.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/145535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/145535.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/145535.html</trackback:ping><description><![CDATA[     摘要:  Hibernate的检索策ç•? 立即‹‚€ç´¢ã€åšg˜qŸæ£€ç´¢ï¼Œé¢„å…ˆæŠ“å–å’Œæ‰¹é‡æ£€ç´¢éƒ½æ˜¯äØ“äº†ä¼˜åŒ–åŠ è½½æ€§èƒ½è€Œè®¾¾|®çš„½{–略。立卛_Š è½½ã€åšg˜qŸåŠ è½½ã€é¢„å…ˆæŠ“å–æ˜¯åŒä¸€¾U§åˆ«çš„ç­–ç•¥ï¼Œå› äØ“å®ƒä»¬æ˜¯ä¸‰é€‰ä¸€çš„ç­–ç•¥ã€‚ç”¨äº†å…¶ä¸­ä¸€ä¸ªåˆ™å¦å¤–ä¸¤ä¸ªž®×ƒ¸å¯ç”¨äº†ï¼Œè€Œä¸”被åšg˜qŸåŠ è½½çš„å¯¹è±¡å½“æœ€¾lˆè¢«åŠ è²æ—Óž¼Œä¸€å®šæ˜¯ä½¿ç”¨äº†ç«‹å›_Š è½½çš„å½¢å¼ã€‚å¦‚æžœåœ¨é…ç½®æ–‡äšg中设¾|®äº†å¯ÒŽŸä¸ªå±žæ€§çš„预先抓取åQŒåˆ™å¯ÒŽ­¤å±žæ€§çš„其他加蝲讄¡½®å…¨éƒ¨å¤±æ•ˆåQˆæ¯”如还讄¡½®äº†åšg˜qŸåŠ è½½ï¼Œæ­¤æ—¶å¤±æ•ˆåQ‰ã€?..  <a href='http://www.aygfsteel.com/keweibo/articles/145535.html'>阅读全文</a><img src ="http://www.aygfsteel.com/keweibo/aggbug/145535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2007-09-16 14:52 <a href="http://www.aygfsteel.com/keweibo/articles/145535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的数据库事务½Ž¡ç†http://www.aygfsteel.com/keweibo/articles/145533.htmlKeKeSun, 16 Sep 2007 06:50:00 GMThttp://www.aygfsteel.com/keweibo/articles/145533.htmlhttp://www.aygfsteel.com/keweibo/comments/145533.htmlhttp://www.aygfsteel.com/keweibo/articles/145533.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/145533.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/145533.html

    一ã€?span style="font: 7pt 'Times New Roman'">           数据库事务概å¿?/span>

    数据库事务的特征åQ?/span> ACID

    Atomic åQˆåŽŸå­æ€§ï¼‰ã€?/span> Consistency åQˆä¸€è‡´æ€§ï¼‰ã€?/span> Isolation åQˆé𔼛ÀL€§ï¼‰å’?/span> Durability åQˆæŒä¹…性)ã€?/span> DBMS 用日志来保证数据的原子性、一致性和持久性;用锁的机制来保证数据的隔¼›ÀL€§ã€?/span>

    二ã€?span style="font: 7pt 'Times New Roman'">           事务的边ç•?/span>

    数据库支æŒ?/span> 2 ¿Uäº‹åŠ¡æ¨¡å¼ï¼šè‡ªåŠ¨æäº¤å’Œæ‰‹åŠ¨æäº¤ã€?/span>

    JDBC API 的事务边�/span>

    try
    {
        Connection conn 
    =  java.sql.DriverManager,.getConnection(dbUrl,dbUser,dbPwd);
        conn.setAutoCommit(
    false );  // 讄¡½®æˆæ‰‹åŠ¨æ¨¡å¼?/span>
        stmt  =  conn.createStatement();
        stmt.executeUpdate(
    " . " );  // 数据库更æ–?
        stmt.executeUpdate( " . " );  // 数据库更æ–?
        
        conn.commit();
    }

    catch (Exception e)
    {
        conn.rollback();
    }

    finally
    {
        stmt.close();
        conn.close();
    }

    Hibernate API 声明事务边界

    Session session  =  factory.openSession();
    Transaction tx;
    try  
    {
        tx 
    =  session.beginTransaction();  // 开始事åŠ?br />      // 执行操作
        ã€‚。。。ã€?br />     
        tx.commit();
    }

    catch  (Exception e)
    {
        
    if  (tx != null )
        
    {
            tx.rollback();
        }

    }

    finally
    {
        session.close();
    }

    注:一ä¸?/span> session 可以对应多个事务åQŒä½†æ˜¯æŽ¨èçš„做法是一ä¸?/span> session 对应一个事务ã€?/span>

    三ã€?/font>            多事务的òq¶å‘问题

    当多个事务同时访问相同的数据的时候,½E‹åºå¦‚果没有采取适当的隔¼›ÀLŽªæ–½ï¼Œž®×ƒ¼šå‘生数据库的òq¶å‘问题。常见的òq¶å‘问题有:

    ½W¬ä¸€¾cÖM¸¢å¤±æ›´æ–ŽÍ¼šæ’¤æ¶ˆäº‹åŠ¡çš„æ—¶å€™ï¼ŒæŠŠå…¶ä»–çš„äº‹åŠ¡å·²ç»æäº¤çš„æ•°æ®ç»™è¦†ç›–äº†ï¼›

    脏读åQ›è¯»äº†æ²¡æœ‰æäº¤çš„æ•°æ®åQ?/span>

    虚读åQšä¸€ä¸ªäº‹åŠ¡è¯»åˆ°å¦å¤–ä¸€ä¸ªäº‹åŠ¡å·²¾læäº¤çš„æ–°æ’入的数据åQ?/span>

    不可重复读:一个事务读到另外一个事务已¾læäº¤çš„æ›´æ–°çš„æ•°æ®ï¼›

    ½W¬äºŒ¾cÖM¸¢å¤±æ›´æ–ŽÍ¼šä¸€ä¸ªäº‹åŠ¡è¦†ç›–å¦å¤–ä¸€ä¸ªäº‹åŠ¡å·²¾læäº¤çš„æ›´æ–°æ•°æ®ã€?/span> 
    å››ã€?/strong>          
    é”?/span>

    一般地åQŒå¤§åž‹çš„ DBMS 都会自动的管理锁定机åˆÓž¼Œä½†æ˜¯åœ¨å¯¹æ•°æ®çš„安全性、完整性和一致性有ç‰ÒŽ®Šè¦æ±‚的地方,可以ç”׃º‹åŠ¡æœ¬íw«æ¥½Ž¡ç†ççš„æœºåˆ¶ã€?/span>

    有一点要å…Ïx³¨çš„æ˜¯åQšé”çš„粒度越大,隔离性越好,òq¶å‘性越差ã€?/span>

    按照锁的½E‹åº¦æ¥åˆ†æœ‰ï¼š

    å…׃ín锁:用读操作åQŒéžç‹¬å çš„,其他事务可以读,但是不能更新åQŒåƈ发性好åQ?/span>

    独占锁:用与 insert update å’?/span> delete ½{‰è¯­å¥ï¼Œå…¶ä»–事务不能读,也不能改åQŒåƈ发性差åQ?/span>

    更新锁:执行 update 的时候,加锁�/span>

    æ­ÈåQšå¤šæ˜¯äº‹åŠ¡åˆ†åˆ«é”å®šäº†ä¸€ä¸ªèµ„æºï¼Œåˆè¯·æ±‚é”å®šå¯¹æ–¹å·²¾lé”å®šçš„资源åQŒå°±é€ æˆäº†è¯·æ±‚环ã€?/span>

    降低死锁的最好办法是使用短事务�/span>

    五ã€?/font>            数据库的事务隔离¾U§åˆ«

    数据库提ä¾?/span> 4 ¿Uäº‹åŠ¡éš”¼›Èñ”别:

    Serializable åQšä¸²è¡ŒåŒ–åQ›ï¼ˆéš”离¾U§åˆ«æœ€é«˜ï¼‰ 1

    Repeatable Read åQšå¯é‡å¤è¯»ï¼› 2

    Read Commited åQšè¯»å·²æäº¤æ•°æ®ï¼› 4

    Read Uncommited åQšè¯»æœªæäº¤æ•°æ®ï¼›åQˆéš”¼›Èñ”别最低) 8

    Hiberate 中的隔离¾U§åˆ«çš„设¾|?/span>

    åœ?/span> Hibernate 的配¾|®æ–‡ä»¶ä¸­ hibernate.connection.isolation=2

    å…­ã€?/font>            悲观锁和乐观ç?/span>

    从应用程序的角度来看åQŒé”åˆ†äؓ悲观锁和乐观锁ã€?/span>

    悲观锁:昄¡¤ºçš„䨓½E‹åºåР锁åQŒä½†æ˜¯é™ä½Žåƈ发性ã€?/span>

    Select ……. For update;

    �/span> Hibernate 中的代码

    Session.get(Account.class,net Long(1),LockMode.UPGRADE) åQ?/span> // ½E‹åºé‡‡ç”¨æ‚²è§‚é”?/span>

    乐观锁:依靠 DBMS 来管理锁åQŒç¨‹åºä¾é ç‰ˆæœ¬æŽ§åˆ¶æ¥é¿å…òq¶å‘问题ã€?/span>

    在对è±?/span> - 关系映射的文件中åQŒç”¨ <version> 或è€?/span> <timestamp> 可以½Ž¡ç†òq¶å‘。乐观琐比悲观琐有更好的òq¶å‘性,优先考虑乐观琐ã€?/span>  

    http://www.aygfsteel.com/sodmewuhan/archive/2006/04/22/42505.html


    ]]>
    Hibernate的检索策�http://www.aygfsteel.com/keweibo/articles/145532.htmlKeKeSun, 16 Sep 2007 06:48:00 GMThttp://www.aygfsteel.com/keweibo/articles/145532.htmlhttp://www.aygfsteel.com/keweibo/comments/145532.htmlhttp://www.aygfsteel.com/keweibo/articles/145532.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/145532.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/145532.html

    Hibernate 提供äº?/span> 3 ¿Uæ£€ç´¢ç­–略:

    l        延迟‹‚€ç´¢ï¼›

    l        立即‹‚€ç´¢ï¼›

    l        ˜q«åˆ‡å·¦å¤–˜qžæŽ¥åQ?/span>

    Hibernate 提供 2 ¿Uæ–¹å¼æ¥¼‹®å®š‹‚€ç´¢ç­–略,一中是在配¾|®æ–‡ä»¶å½“中,另外一¿Uæ˜¯åœ¨ç¨‹åºç§è®„¡½®ã€‚当ç„Óž¼Œå¦‚果你在½E‹åºä¸­è®¾¾|®äº†‹‚€ç´¢ç­–略,那么你在配置文äšg中的讄¡½®ä¹Ÿå°±æ— æ•ˆäº†ã€‚另外的一¿Uæƒ…冉|˜¯ HQL 会忽略配¾|®æ–‡ä»¶çš„讄¡½®åQŒè€Œæ€ÀL˜¯é‡‡ç”¨˜q«åˆ‡å·¦å¤–˜qžæŽ¥ã€?/span>

    一ã€?¾cȝñ”别的‹‚€ç´?/span>

    可以选择的检索策略是立即‹‚€ç´¢å’Œå»¶è¿Ÿ‹‚€ç´¢ï¼Œé»˜è®¤çš„æ˜¯ç«‹å³‹‚€ç´¢ã€‚用配置文äšg中的 <class> 节点çš?/span> lazy 来控制ã€?/span>

    注意åQšä¸½Ž¡ä½ åœ¨é…¾|?/span> class çš?/span> lazy æ˜?/span> true ˜q˜æ˜¯ false åQŒå¯¹ get() å’?/span> create Criteria () æ–ÒŽ³•都不起作用,只有å¯?/span> load() æ–ÒŽ³•起作用ã€?/span>

    当你使用的检索策略是 lazy 的时候,当你执行

    Customer customer = (Customer)session.load(Customer.class,new Long(1));

    的时候, Hibernate 不从数据库检索数据,而只是äñ”生一个代理类åQŒåªæœ‰å½“你执è¡?/span>

    Customer.getName();

    的时候, Hibernate 才到数据库取数据。所以,如下的代码是会被抛出异常的:

    Session session  =  sessionFactory.openSession();
    transaction tx 
    =   null ;
    tx 
    =  session.beginTransaction();
      Customer customer 
    =  (Customer)session.load(Customer. class , new  Long( 1 ));
    tx.commit();
      session.close();
    customer.getName();

    get() æ–ÒŽ³•æ€ÀL˜¯ç”¨çš„立即‹‚€ç´¢ï¼Œå¦‚果和它相关联的¾cÖM¹Ÿæ˜¯ç”¨çš„ç«‹åÏx£€ç´¢ï¼Œé‚£ä¹ˆä¹Ÿä¼šæŠŠç›¸å…Œ™”的数据也‹‚€ç´¢å‡ºæ¥ã€?/span>

    二�一对和多对多关联检�/span>

    一般地åQŒäؓ了有减少å¯ÒŽ•°æ®åº“的访问,我们往往用åšg˜qŸæ£€ç´¢çš„½{–略。所以,我们优先使用如下方式åQ?/span>

    <set class=”order” inverse=”true’ lazy=”true” >

    但是åQŒæˆ‘们在‹‚€ç´?#8220;å¤?#8221;的一方的时候, Hibernate 不能为我们äñ”生代理类。由此,我们ž®Þp¦ç”?/span> betch-size 的配¾|®æ¥å‡å°‘ SQL 语句ã€?/span>

    当我们ä‹Éç”?/span> outer-join 属性的时候,我们ž®±æ²¡æœ‰å¿…要ä‹Éç”?/span> lazy 属性了ã€?/span> Outer-join 会一‹Æ¡å°†“一”方和与之相关çš?#8220;å¤?#8221;方用左外˜qžæŽ¥çš„æ–¹å¼æ£€ç´¢å‡ºæ¥ã€?/span>

    Session session = sessionFactory.openSession();

                         Transaction tx = null;

                         tx = session.beginTransaction();

                        Customer customer = (Customer)session.get(Customer.class,new Long(1));

    产生çš?/span> SQL 语句如下åQ?/span>

    Hibernate: select customer0_.ID as ID1_, customer0_.NAME as NAME2_1_, orders1_.CUSTOMER_ID as CUSTOMER3_3_, orders1_.ID as ID3_, orders1_.ID as ID0_, orders1_.ORDER_NUMBER as ORDER2_1_0_, orders1_.CUSTOMER_ID as CUSTOMER3_1_0_ from sampledb.customers customer0_ left outer join sampledb.orders orders1_ on customer0_.ID=orders1_.CUSTOMER_ID where customer0_.ID=?



    ]]>
    Hibernate中ä‹É用过滤器完成事务处理http://www.aygfsteel.com/keweibo/articles/141088.htmlKeKeWed, 29 Aug 2007 13:29:00 GMThttp://www.aygfsteel.com/keweibo/articles/141088.htmlhttp://www.aygfsteel.com/keweibo/comments/141088.htmlhttp://www.aygfsteel.com/keweibo/articles/141088.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/141088.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/141088.html实现的功èƒ?   é€šè¿‡Hibernate的工å…ïL±»å¾—到一个全局唯一的SessionFactory对象
                            é€šè¿‡SessionFactory对象得到Session对象,然后开始一个新的事åŠ?br>                        é€šè¿‡chain对象的doFilter()æ–ÒŽ³•来完成业务处ç?br>                        æäº¤æˆ–者回滚事åŠ?

    HibernateFilter.java

    import java.io.IOException;

    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.hibernate.SessionFactory;

    import cn.hxex.blog.hibernate.HibernateUtil;

    public class HibernateFilter implements Filter {

        private static Log log = LogFactory.getLog(HibernateFilter.class);

        /**
         * ˜q‡æ×o器的主要æ–ÒŽ³•
         * 用于实现Hibernate事务的开始和提交
         */
        public void doFilter(ServletRequest request,
                             ServletResponse response,
                             FilterChain chain)
                throws IOException, ServletException
        {
         // 得到SessionFactory对象的实ä¾?br>     SessionFactory sf = HibernateUtil.getSessionFactory();

            try
            {
             // 开始一个新的事åŠ?br>            log.debug("Starting a database transaction");
                sf.getCurrentSession().beginTransaction();

                log.debug( "Request Path:\t" + ((HttpServletRequest)request).getServletPath() );
                // Call the next filter (continue request processing)
                chain.doFilter(request, response);

                // 提交事务
                log.debug("Committing the database transaction");
                sf.getCurrentSession().getTransaction().commit();

            }
            catch (Throwable ex)
            {
             ex.printStackTrace();
                try
                {
                 // 回滚事务
                    log.debug("Trying to rollback database transaction after exception");
                    sf.getCurrentSession().getTransaction().rollback();
                }
                catch (Throwable rbEx)
                {
                    log.error("Could not rollback transaction after exception!", rbEx);
                }

                // 抛出异常
                throw new ServletException(ex);
            }
        }

        /**
         * Servlet˜q‡æ×o器的初始化方æ³?br>     * 可以è¯Õd–配置文äšg中设¾|®çš„配置参数
         */
        public void init(FilterConfig filterConfig) throws ServletException {}

        /**
         * Servlet的销毁方æ³?br>     * 用于释放˜q‡æ×o器所甌™¯·çš„资æº?br>     */
        public void destroy() {}

    }



    ]]>
    一个公å…Þqš„实体对象基类http://www.aygfsteel.com/keweibo/articles/141067.htmlKeKeWed, 29 Aug 2007 11:48:00 GMThttp://www.aygfsteel.com/keweibo/articles/141067.htmlhttp://www.aygfsteel.com/keweibo/comments/141067.htmlhttp://www.aygfsteel.com/keweibo/articles/141067.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/141067.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/141067.html在徏立实体对象之å‰?可以先实çŽîC¸€ä¸ªå…¬å…Þqš„实体对象基类.在这个基¾cÕd¯¹è±¡ä¸­å¯ä»¥åŒ…含代表每一个实体对象唯一çš?br>标识 id 属æ€?以及一些公用的æ–ÒŽ³•.具体如下

    BaseModel.java

    import java.io.Serializable;

    import org.apache.commons.lang.builder.EqualsBuilder;
    import org.apache.commons.lang.builder.HashCodeBuilder;
    import org.apache.commons.lang.builder.ReflectionToStringBuilder;

    public class BaseModel implements Serializable{

     /**
      * The Generated SerialVersionUID
      */
     private static final long serialVersionUID = 7766184319541530720L;
     
     /**
      * The identify of the object
      */
     private String id;

     public String getId() {
      return id;
     }

     public void setId(String id) {
      this.id = id;
     }
     
     /**
      * Common implement equals method
      */
     public boolean equals( Object obj )
     {
      if( this==obj ) return true;
      
      if( !( obj instanceof BaseModel ) )
       return false;
      
      BaseModel target = (BaseModel)obj;
      
      if( this.getId()!=null && this.getId().length()>0 )
      {
       return this.getId().equals( target.getId() );
      }
      
      if( target.getId()!=null && target.getId().length()>0 )
      {
       return false;
      }
      
      return EqualsBuilder.reflectionEquals(this, obj);
     }

     /**
      * Generate the hash code
      */
     public int hashCode()
     {
      if( this.getId()!=null && this.getId().length()>0 )
      {
       return this.getId().hashCode();
      }
       
      return HashCodeBuilder.reflectionHashCode(this);
     }

     /**
      * Common implement toString method
      */
     public String toString()
     {
      return ReflectionToStringBuilder.toString( this );
     }
    }
             equals()æ–ÒŽ³•,用于判断两个对象是否相等,ä½†åÆˆä¸æ˜¯åœ¨ä‹Éç”?=="˜q›è¡Œä¸¤ä¸ªå¯¹è±¡æ˜¯å¦ç›¸ç­‰çš„判断时调用.å› äØ“ä½¿ç”¨"=="所判断的是两个对象的引用是否相½{?ä¹Ÿå¯ä»¥ç®€å•ç†è§£äØ“ä¸¤ä¸ªå®žä¾‹æ‰€å¼•ç”¨çš„æ˜¯å¦äØ“å†…å­˜ä¸­çš„åŒä¸€ä¸ªå¯¹è±?equals()æ–ÒŽ³•可以理解ä¸ÞZ¸¤ä¸ªå¯¹è±¡åœ¨"含义"上是否相½{?也就是说˜q™ä¸¤ä¸ªå¯¹è±¡æ‰€è¡¨è¾¾çš„æ„æ€æ˜¯å¦ç›¸å?equals()æ–ÒŽ³•在对象保存到集合容器¾c?Collection)中时被调ç”?å› äØ“é›†åˆå®¹å™¨¾cÖM¸å…è®¸å…¶ä¸­å­˜åœ¨ä¸¤ä¸ªç›¸åŒå¯¹è±¡å®žä¾‹,其判断的依据ž®±æ˜¯é€šè¿‡è°ƒç”¨è¯¥å®žä½“对象的equals()æ–ÒŽ³•来进行判断的.
             å¦‚果修改了equals()æ–ÒŽ³•,ž®±å¿…™åÖM¿®æ”¹hashCode()æ–ÒŽ³•.如果不这æ ïLš„è¯?ž®Þp¿åjava.lang.Object的通用的hashCode的约å®?从而导致该¾cÀL— æ³•与åŸÞZºŽæ•£åˆ—值的集合¾cÖM¸€èµäh­£å¸¸å·¥ä½?
             toString()æ–ÒŽ³•,用于ž®†å½“前Java对象的实例è{æ¢äØ“å¯ä»¥æè¿°å…¶å†…å®¹çš„å­—ç¬¦ä¸?˜q™ä¸ªæ–ÒŽ³•的作用是在程序调试的˜q‡ç¨‹å¯ä»¥æ–¹ä¾¿åœ°å¾—到实体对象中令äh感兴­‘£çš„信息,有利于更准确及时地发现程序中的问é¢?



    ]]>
    Hibernate 的工å…ïL±»http://www.aygfsteel.com/keweibo/articles/141061.htmlKeKeWed, 29 Aug 2007 11:12:00 GMThttp://www.aygfsteel.com/keweibo/articles/141061.htmlhttp://www.aygfsteel.com/keweibo/comments/141061.htmlhttp://www.aygfsteel.com/keweibo/articles/141061.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/141061.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/141061.htmlHibernate 的工å…ïL±»

      å¯¹äºŽHibernate 3.1 以前的的版本在实现Hibernate工具¾cÀL—¶,需要通过两个¾U¿ç¨‹
    局部变量来保存与当前进行相对应的Session和事务对象的实例.
      è€Œå¯¹äºŽHibernate 3.1 以后的版æœ?使用¾U¿ç¨‹å±€éƒ¨å˜é‡ä¿å­˜Session和事务对象的
    工作ž®±å®Œå…¨ä¸éœ€è¦è‡ªå·±åŽ»å®žçŽ°äº?只需在Hibernate.cfg.xml配置文äšg中增加一个名ä¸?br>Current_session_context_class的属æ€?òq¶ä¸”讄¡½®è¯¥å±žæ€§çš„å€égØ“thread.˜q™æ ·Hibernate
    ž®±å¯ä»¥è‡ªåŠ¨åœ°ä½¿ç”¨¾U¿ç¨‹å±€éƒ¨å˜é‡æ¥ä¿å­˜å½“前的进½E‹çš„Session和事务对象了.
      ç›¸åº”åœ?Hibernateä¹ŸäØ“å…¶Session对象增加了getTransaction()æ–ÒŽ³•,以便可以随时
    å¾—åˆ°å½“å‰çš„äº‹åŠ¡åÆˆ˜q›è¡Œæäº¤æˆ–者回滚操ä½?˜q™ä¸ªæ–ÒŽ³•在以前版本的hibernate中是不存åœ?br>çš?
    Hibernate工具¾cÖM¸»è¦åŒ…括以下功èƒ?
    (1)Hibernate的初始化操作
      ˜q™ä¸ªåŠŸèƒ½ä¸æ”¾åœ¨ä“Q何方法中,采用静态编码的处理方式,在对象的初始化的时候被
      è°ƒç”¨ä¸€‹Æ¡å°±å¯ä»¥äº?
    (2)得到当前的配¾|®ä¿¡æ?/em>
      ˜q™ä¸ªæ–ÒŽ³•可以得到当前的配¾|®ä¿¡æ?以便于动态进行配¾|®å‚数的修改.hibernate
      çš„配¾|®ä¿¡æ¯åªåœ¨Hibernate初始化的时候ä‹É用一‹Æ?在完成初始化之后寚w…¾|®æ–‡ä»?br>  æˆ–者Configuration对象所做的修改ž®†ä¸ä¼šç”Ÿæ•?
    (3)得到SessionFactory对象的实�/em>
      ˜q™ä¸ªæ–ÒŽ³•用于得到当前¾pȝ»Ÿ˜qè¡Œæ—¶çš„SessionFactory对象的实ä¾?˜q™ä¸ªå¯¹è±¡çš„实ä¾?br>  å¯¹äºŽæ•´ä¸ª¾pȝ»Ÿè€Œè¨€æ˜¯å…¨å±€å”¯ä¸€çš?
    (4)释放各种资源
      ˜q™ä¸ªæ–ÒŽ³•用于¾lˆæ­¢Hibernate的报务后,释放各种Hibernate所使用的资æº?虽然˜q™ä¸ª
      æ–ÒŽ³•几乎不会用到,但对于申误‚µ„源的及时释放是每个程序应该掌握的基本原则.
    (5)重徏SessionFactory
      ç”׃ºŽSessionFactory对于整个Hibernate应用是唯一çš?òq¶ä¸”是在Hibernate初始åŒ?br>  ä¹‹åŽå»ºç«‹å¥½çš„,而且对于配置文äšg的修改也不会影响到已¾låˆå§‹åŒ–çš„SessionFactory
      å¯¹è±¡.那么如何才能使修改的配置信息对Hibernate起作用呢.˜q™å°±éœ€è¦é‡å»ºSessionFactory
      å¯¹è±¡å®žä¾‹.
    (6)拦截器注�/em>
      ç”¨äºŽæ³¨å†Œæ‹¦æˆªå™¨åƈ重徏SessionFactory.
    HibenateUtil.java
    import javax.naming.InitialContext;
    import javax.naming.NamingException;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.hibernate.Interceptor;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.cfg.Environment;


    /**
     * 基础的Hibernate辅助¾c»ï¼Œç”¨äºŽHibernate的配¾|®å’Œå¯åЍã€?br> * <p>
     * 通过静态的初始化代码来è¯Õd–Hibernate启动参数åQŒåƈ初始åŒ?br> * <tt>Configuration</tt>å’?lt;tt>SessionFactory</tt>对象ã€?br> * <p>
     *
     * @author galaxy
     */
    public class HibernateUtil
    {

        private static Log log = LogFactory.getLog(HibernateUtil.class);

        // 指定定义拦截器属性名
        private static final String INTERCEPTOR_CLASS = "hibernate.util.interceptor_class";

        // 静态Configurationå’ŒSessionFactory对象的实例(全局唯一的)
        private static Configuration configuration;
        private static SessionFactory sessionFactory;

        static
        {
            // 从缺省的配置文äšg创徏SessionFactory
            try
            {
             // 创徏默认的Configuration对象的实ä¾?br>         // 如果你不使用JDK 5.0或者注释请使用new Configuration()
             // 来创建Configuration()对象的实ä¾?br>            configuration = new Configuration();

                // è¯Õd–hibernate.properties或者hibernate.cfg.xmlæ–‡äšg
                configuration.configure();

                // 如果在配¾|®æ–‡ä»¶ä¸­é…ç½®äº†æ‹¦æˆªå™¨åQŒé‚£ä¹ˆå°†å…¶è®¾¾|®åˆ°configuration对象ä¸?br>            String interceptorName = configuration.getProperty(INTERCEPTOR_CLASS);
                if (interceptorName != null)
                {
                    Class interceptorClass =
                            HibernateUtil.class.getClassLoader().loadClass(interceptorName);
                    Interceptor interceptor = (Interceptor)interceptorClass.newInstance();
                    configuration.setInterceptor(interceptor);
                }

                if (configuration.getProperty(Environment.SESSION_FACTORY_NAME) != null)
                {
                    // 让Hibernatež®†SessionFacory¾l‘定到JNDI
                    configuration.buildSessionFactory();
                }
                else
                {
                    // 使用静态变量来保持SessioFactory对象的实ä¾?br>                sessionFactory = configuration.buildSessionFactory();
                }

            }
            catch (Throwable ex)
            {
                // 输出异常信息
                log.error("Building SessionFactory failed.", ex);
                ex.printStackTrace();
                throw new ExceptionInInitializerError(ex);
            }
        }

        /**
         * ˜q”回原始的Configuration对象的实ä¾?br>     *
         * @return Configuration
         */
        public static Configuration getConfiguration()
        {
            return configuration;
        }

        /**
         * ˜q”回全局的SessionFactory对象的实ä¾?br>     *
         * @return SessionFactory
         */
        public static SessionFactory getSessionFactory()
        {
            SessionFactory sf = null;
            String sfName = configuration.getProperty(Environment.SESSION_FACTORY_NAME);
            if ( sfName != null)
            {
                log.debug("Looking up SessionFactory in JNDI.");
                try
                {
                    sf = (SessionFactory) new InitialContext().lookup(sfName);
                }
                catch (NamingException ex)
                {
                    throw new RuntimeException(ex);
                }
            }
            else
            {
                sf = sessionFactory;
            }
            if (sf == null)
                throw new IllegalStateException( "SessionFactory not available." );
            return sf;
        }

        /**
         * 关闭当前的SessionFactoryòq¶ä¸”释放所有的资源
         */
        public static void shutdown()
        {
            log.debug("Shutting down Hibernate.");
            // Close caches and connection pools
            getSessionFactory().close();

            // Clear static variables
            configuration = null;
            sessionFactory = null;
        }


        /**
         * 使用静态的Configuration对象来重新构建SessionFactoryã€?br>     */
         public static void rebuildSessionFactory()
         {
            log.debug("Using current Configuration for rebuild.");
            rebuildSessionFactory(configuration);
         }

        /**
         * 使用指定的Configuration对象来重新构建SessionFactory对象ã€?br>     *
         * @param cfg
         */
         public static void rebuildSessionFactory(Configuration cfg)
         {
            log.debug("Rebuilding the SessionFactory from given Configuration.");
            synchronized(sessionFactory)
            {
                if (sessionFactory != null && !sessionFactory.isClosed())
                    sessionFactory.close();
                if (cfg.getProperty(Environment.SESSION_FACTORY_NAME) != null)
                    cfg.buildSessionFactory();
                else
                    sessionFactory = cfg.buildSessionFactory();
                configuration = cfg;
            }
         }

        /**
         * 在当前SessionFactory中注册一个拦截器
         */
        public static SessionFactory registerInterceptorAndRebuild(Interceptor interceptor)
        {
            log.debug("Setting new global Hibernate interceptor and restarting.");
            configuration.setInterceptor(interceptor);
            rebuildSessionFactory();
            return getSessionFactory();
        }

        /**
         * 获得拦截器对è±?br>     *
         * @return Interceptor
         */
        public static Interceptor getInterceptor()
        {
            return configuration.getInterceptor();
        }

        /**
         * 提交当前事务åQŒåƈ开始一个新的事åŠ?br>     */
        public static void commitAndBeginTransaction()
        {
         sessionFactory.getCurrentSession().getTransaction().commit();
         sessionFactory.getCurrentSession().beginTransaction();
        }
    }

     



    ]]>
    Ö÷Õ¾Ö©Öë³ØÄ£°å£º ËÉÌÒ| ÌïÑôÏØ| ãòÎ÷ÏØ| ´óÒ±ÊÐ| Î÷²ýÊÐ| ¸ñ¶ûľÊÐ| ÔÀ³ØÏØ| ÒÀÀ¼ÏØ| ²ßÀÕÏØ| ·á³ÇÊÐ| ËçÑôÏØ| ¸Á¶ûÏØ| ß®ÑôÏØ| ±±°²ÊÐ| Î÷ÁÖÏØ| ÃɳÇÏØ| ÖîôßÊÐ| ÷ëÓÎÏØ| ºâÑôÊÐ| ÓÚ¶¼ÏØ| °ÍÁÖÓÒÆì| ĪÁ¦| ÈéɽÊÐ| ÎäÒåÏØ| ÓÀÊ¤ÏØ| º£ÑôÊÐ| ÁÙ³ÇÏØ| ÕżҽçÊÐ| ³¤ÄþÇø| Îè¸ÖÊÐ| ÑÉêÈ| º£ÑôÊÐ| ³Î³ÇÏØ| ÄÒÇ«ÏØ| ¸§Ô¶ÏØ| ÁÙ½­ÊÐ| ³çÈÊÏØ| ÅíÔóÏØ| ÜÝÆ½ÏØ| ¸ßÌÆÏØ| ÉÐÖ¾ÊÐ|