??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩一区二区免费视频,欧美一区二粉嫩精品国产一线天,国产成人精品日本亚洲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 />二、用OpenSessionInViewFilterqo器,注意hibernateFilterqo器和struts2qo器在映射时的先后序。同时要配置事物处理Q否则会Dsession处于只读状态而不能做修改、删除的动作?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的日期cdhttp://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数据库对应表的Columncd为Date
JavacM字段的类型ؓ 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>标签所指明的属性所对应的字Dc?/p> <p>同理Qinsert=”true|false”</p> <p>如果讄为false,则在hibernate的insert语句里面没有<property>标签所指明的属性所对应的字Dc?/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>Step1Q安装好Hibernate ToolsQ徏立一个Dynamic web project,W者工E名?#8220;HibernateTest”</p> <p>Step2Q笔CMysql为示例,所以安装一个MysqlQ徏立相应测试数据库及表Q下图ؓW者的数据库及?/p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310170478.jpg" alt="" /></p> <p>Step3Q将MySql的Jdbc驱动拯至lib目录Q笔者的为mysql-connector-java-5.1.14-bin.jarQ可以去Mysql官网下蝲</p> <p>Step4Q利用Hibernate Tools生成hibernate.cfg.xml文gQ如下图Q?/p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310200339.jpg" alt="" height="145" width="586" /></p> <p>点击后可以对hibernate.cfg.xml命oQ不它直接默认转到下一步的配置界面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>Step5QHibernate Console 配置</p> <p>a.右键工程Q点击Run as-Run Configurationsq入如下界面q择Hibernate Console ConfigurationQ?/p> <p><img src="http://pic002.cnblogs.com/images/2010/112250/2010122310343581.jpg" alt="" /></p> <p>b.新徏一个Configure名ؓHibernateConsoleQ名字可随个人爱好来命名</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将它们Includeq来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心的时刻pC</p> <p>a.在Eclipse的工h中将Hibernate Code Generate昄出来Q显C出来后点击Hibernate Code Generate ConfigurationsQ如下图:</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标签,选择要生成的文gQ记得勾上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>很奇怪我的项目ƈ没有使用到JNDIQ但是却抛出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样Qhibernate会试图把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地址Qhttp://ant.apache.org/bindownload.cgi?Preferred=http%3A%2F%2Fapache.etoak.com

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

先决条gQ?/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-extensionsQƈ解压?/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>MySQLQ在Middlegen-Hibernate-r5\config\database目录中有一?/span>mysql.xml文gQ是用来配置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>antq行文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>antQ进?/span>Middlegen-Hibernate的图形界面。可以设|表Q和字段的特性。然后按GenarateQ?/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文gQ改变其内容为:

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-extensionsQ根?/span>hbm.xml产生POJO文g

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

轉自Qhttp://www.aygfsteel.com/relax/archive/2005/03/01/1588.html



Ke 2009-08-26 10:50 发表评论
]]>
[转]一个泛型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阅读全文

Ke 2008-03-06 23:17 发表评论
]]>
多对多关联关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一张辅助表来存储多对多的单向关pM可以Q但是不值得
q么做,因ؓ多对多的单向关系可以用多对一或者一对多的半向关pL表达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,兌cLCourse,本ncd是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>
注意QStudent与Course的cascade都设|ؓsave-updateQ在多对多的关系中,all,delete{?br /> cascade是没有意义的Q因为多对多关系中,q不能因为父对象被删除,而造成被包括的子对?br /> 被删除,因ؓ可能q有其他的父对象参考了q个子对象?/span>

另外Q在多对多关pMQ如果双斚w有控制权Q也是双方都没有设|inverse="true"Q,?br /> 双方都要把关联关pd映到数据库。必d某一方设|inverse="true"Q然后在执行语句时?br /> L方进行操作(也就是没有设|inverse="true"的那一方)?/strong>



Ke 2007-12-29 15:01 发表评论
]]>
一对多、多对一兌关系的?/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>  一对多和多对一关系在实际生zM是非常常见的。在~写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>标签hcolumn属性,column属性L和关联类Q对于Student来说Q关联类<br /> 是TeamQ的主键id 相对应,因此Hibernate会根据student表中的team_idQ根据Team表中讄<br /> 的id列(一般情况列名也叫idQ,取出team.id=student.team_id的记录,构造成Team对象q?br /> 回给StudentcR?/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_idq行匚wQ如?br /> team.id=student.team_idQ则认ؓ此学生是本班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它负责自qid告诉Student<br /> Q然后Hibernate发送update语句L新记录。但现在讄了inverse="true"之后Q维护权?br /> Student手中Q于是Hibernate不再发送update语句Q而由Student自动d得team_idQ而这?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>  一对一关系在实际生zM是比较常见的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和以主键兌时的代码是一LQƈ没有改变?/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-oneq一边上加上一?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支持DetachedCriteriaQ这是一个非常有意义的特性!我们知道Q在常规的Web~程中,有大量的动态条件查询,即用户在|页上面自由选择某些条gQ?a class="bluekey" target="_blank">E序Ҏ用户的选择条gQ动态生成SQL语句Q进行查询?

  针对q种需求,对于分层应用E序来说QWeb层需要传递一个查询的条g列表l业务层对象Q业务层对象获得q个条g列表之后Q然后依ơ取出条Ӟ构造查询语句。这里的一个难Ҏ条g列表用什么来构造?传统上用MapQ但是这U方式缺陷很大,Map可以传递的信息非常有限Q只能传递name和valueQ无法传递究竟要做怎样的条件运,I竟是大于,于QlikeQ还是其它的什么,业务层对象必ȝ切掌握每条entry的隐含条件。因此一旦隐含条件改变,业务层对象的查询构造算法必ȝ应修改,但是q种查询条g的改变是隐式U定的,而不是程序代码约束的Q因此非常容易出错?

  DetachedCriteria可以解决q个问题Q即在web层,E序员用DetachedCriteria来构造查询条Ӟ然后这个DetachedCriteria作ؓҎ调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后Q可以在session范围内直接构造CriteriaQ进行查询。就此,查询语句的构造完全被搬离到web层实玎ͼ而业务层则只负责完成持久化和查询的封装即可,与查询条件构造完全解耦,非常完美Q这恐怕也是以前很多企囑֜web层代码中构造HQL语句的h惛_现的梦想吧!

  CZ代码片段如下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的完封装,即通过匿名cd现回调,来保证Session的自动资源管理和事务的管理。其中核心方法是Q?

  java代码:

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

  回调Ҏ提供了session作ؓ参数Q有了sessionQ就可以自由的用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);

  构造detachedCriteriaQ作为参C递给departmentManager

  业务层代码用springQDepartmentManager的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默认情况下QHibernateTemplate传递给回调接口的sessionq不是org.hibernate.impl.SessionImplc,而是SessionImplcȝ一个ProxycR之所以替换成Z个Proxyc,HibernateTemplate的注释说明,Proxy提供了一些额外的功能Q包括自动设|CachableQTransaction的超时时_Session资源的更U极的关闭等{?

  java代码:

private boolean exposeNativeSession = false;
...

  executeҎ内部Q?

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

  但是遗憾的是QHibernate的DetachedCriteria的setExecutableCriteriaҎ却要求将session参数强制转ؓSessionImplQ但是spring传过来的却是一个Proxyc,因此报错了?

  java代码:

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

  解决ҎQ禁止Spring的HibernateTemplate传递Proxyc,强制要求它传递真实的SessionImplc,即给exexuteҎ增加一个参敎ͼ提供参数为trueQ如下:

  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);
}


Ke 2007-12-05 11:10 发表评论
]]>
扚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抓取是gq查询抓取的优化ҎQ你可以在两U批量抓取方案之间进行选择Q在cȝ别和集合U别?

一对多、多对多Q末端ؓ多)的情况:在集合的配置中设|,?set ZQ如下所C: 

        <set name="students" inverse="true" cascade="all" lazy="false" batch-size="2" ><!-- 一对多的gq加载设|?-->
            <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();
QStudent对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 (?, ?, ?, ?, ?, ?)


Ke 2007-11-06 16:19 发表评论
]]>
外连接与预先抓取的区?摘抄于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.不管Acdproperty1在配|文仉是什么策?可能是预先抓?立即或gq检?它们都失?,q时都采用HQL指定的左外连?左外q接必定会初始化property1属?或对?,但是如果配置文g里对property1的检索策略是延迟加蝲,Acd 到对properyt1的引?Z得到q个引用,需要再ơ发送一条SQL语句来确立这U引用关p?q种情况在property1为集合时l常出现.

2.Acd配置文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"><!-- 一对多的gq加载设|?-->
            <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 />         得到班对象后,׃班对学生采用gq加载(q个{略不会被忽略)Q于是班U的学生集合q未得到初始化,所以当输出学生的h敎ͼ抛Z例外?

Ke 2007-11-06 15:08 发表评论
]]>
Hibernate配置属?Qhibernate.max_fetch_depthQ?/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">方言QDialectQ?/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>在从JDBCd<tt class="literal">binaryQ二q制Q?/tt>或?tt class="literal">serializableQ可序列化)</tt>cd?是否使用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别属性,默认为在可能旉使用CGLIBQ?在调试的时候有时候用反会有用?/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>cd</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>~存提供者的cd</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>cdQHibernate 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环境中,JVMU别的缓存被打开的时候?</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"  ><!-- 多对一的gq加载设|?-->
        <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" >  <!-- 一对多的gq加载设|?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"  ><!-- 一对一的gq加载设|?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"  ><!-- 一对一的gq加载设|?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 的gq加载是在配|文件的class 标签
上设|?lazy="true" Qone-to-many ?many-to-many 的gq加载是?set 标签中设|lazy="true"。而one-to-one 不只要在 classs
标签讄 lazy="true"Q而且要在one-to-one 标签中设|constrained="true" ?br /> 如果不设|constrained="true"Q则一对一查询使用默认的预先抓取策?fetch="join")?/strong>




Ke 2007-11-03 21:13 发表评论
]]>
修改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

如果hcatId持久化标识的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()可以搭配多种LockModeQ?更多信息请阅读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

Ke 2007-10-29 16:15 发表评论
]]>
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中缓存分ZU:一U缓?SessionU别)和二U缓?br /> (SessionFactoryU别)?br />    Session 的作?
    1)充当蓄水池的作用,减少E序讉K数据库的ơ数.很多对象数据不是l常改变?W一ơ访问这些对象时,Hibernate会将它们?br /> 入缓存中,以后只要q个对象没有改动q?讉Kq个对象时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行~存的清?执行一pd的SQL语句,但不会提交事?而commit()Ҏ会先调用flush()Ҏ,然后在提交事?Sessionq有一个方法就是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的缓存的时候是游离状?



Ke 2007-10-29 09:21 发表评论
]]>
应用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提供了DetachedCriteriaQ得我们可以在Web层构造detachedCriteriaQ然后调用业务层BeanQ进行动态条件查询,Ҏ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层构造查询条件detachedCriteriaQ和可选的startIndexQ调用业务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



Ke 2007-10-21 21:51 发表评论
]]>
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.htmlh一个直观的、可扩展的条件查询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.Restrictionsc?nbsp;定义了获得某些内|Criterioncd的工厂方法?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提供了相当多的内|criterioncd(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;没有被条仉qo的。如果你希望只获得符合条件的kittensQ?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. 查询CZ   
  • org.hibernate.criterion.Examplecd怽通过一个给定实?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)、聚合(aggregationQ和分组QgroupingQ?  
  • 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样可以使投影DU束或排序所引用。下面是两种不同的实现方式:    
  •   
  • 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)查询和子查询   
  • DetachedCriteriacM你在一个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支持中文,要是HSQLx持中文,你得使用占位W来讄Q具体可参照Qhttp://.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强制传入SessionImplQ而不是传入Proxy代理c,page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());    
  • c.setProjection(null); 目的是ؓ了获得行敎ͼq设|投׃ؓI,为的是返回List出来Q如果不讄setProjection(null)的话Qc.list返回的是行?int?Q而不是所要查询的数据库信息。但是Criteria的ResultTransformer会变成PassThroughResultTransformerQcriteria.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());   
  •     }   
  •   
  • 来源Qhttp://aimtime812110.spaces.msn.com/Blog/cns!1pXyGS-D6ufSs-1GPdk-fkiQ!108.entry   


  • Ke 2007-10-11 22:13 发表评论
    ]]>
    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.htmlHibernateTemplateq提供一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中用。程序开发者通过HibernateCallbackQ可以完全?/span>Hibernate灉|的方式来讉K数据库,解决SpringHibernate后灵zL不的~陷?/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>SessionQ该Session对象是绑定到该线E的Session实例。该Ҏ内的持久层操作,与不使用Spring时的持久层操作完全相同。这保证对于复杂的持久层讉KQ依然可以?/span>Hibernate的访问方式?/span>



    Ke 2007-10-01 19:54 发表评论
    ]]>
    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阅读全文

    Ke 2007-09-17 22:09 发表评论
    ]]>
    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的检索策? 立即索、gq检索,预先抓取和批量检索都是ؓ了优化加载性能而设|的{略。立卛_载、gq加载、预先抓取是同一U别的策略,因ؓ它们是三选一的策略。用了其中一个则另外两个׃可用了,而且被gq加载的对象当最l被加蝲Ӟ一定是使用了立卛_载的形式。如果在配置文g中设|了Ҏ个属性的预先抓取Q则Ҏ属性的其他加蝲讄全部失效Q比如还讄了gq加载,此时失效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一cM失更斎ͼ撤消事务的时候,把其他的事务已经提交的数据给覆盖了;

    脏读Q读了没有提交的数据Q?/span>

    虚读Q一个事务读到另外一个事务已l提交的新插入的数据Q?/span>

    不可重复读:一个事务读到另外一个事务已l提交的更新的数据;

    W二cM失更斎ͼ一个事务覆盖另外一个事务已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


    Ke 2007-09-16 14:50 发表评论
    ]]>
    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用的立即索,如果和它相关联的cM是用的立x索,那么也会把相兌的数据也索出来?/span>

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

    一般地Qؓ了有减少Ҏ据库的访问,我们往往用gq检索的{略。所以,我们优先使用如下方式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=?



    Ke 2007-09-16 14:48 发表评论
    ]]>
    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);

        /**
         * qo器的主要Ҏ
         * 用于实现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);
            }
        }

        /**
         * Servletqo器的初始化方?br>     * 可以d配置文g中设|的配置参数
         */
        public void init(FilterConfig filterConfig) throws ServletException {}

        /**
         * Servlet的销毁方?br>     * 用于释放qo器所甌的资?br>     */
        public void destroy() {}

    }



    Ke 2007-08-29 21:29 发表评论
    ]]>
    一个公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实体对象基类.在这个基cd象中可以包含代表每一个实体对象唯一?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)中时被调?因ؓ集合容器cM允许其中存在两个相同对象实例,其判断的依据是通过调用该实体对象的equals()Ҏ来进行判断的.
             如果修改了equals()Ҏ,必M改hashCode()Ҏ.如果不这L?p反java.lang.Object的通用的hashCode的约?从而导致该cL法与Z散列值的集合cMh常工?
             toString()Ҏ,用于当前Java对象的实例{换ؓ可以描述其内容的字符?q个Ҏ的作用是在程序调试的q程可以方便地得到实体对象中令h感兴的信息,有利于更准确及时地发现程序中的问?



    Ke 2007-08-29 19:48 发表评论
    ]]>
    Hibernate 的工Lhttp://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工具cL,需要通过两个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工具cM要包括以下功?
    (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>
     * 通过静态的初始化代码来dHibernate启动参数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();

                // dhibernate.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)
                {
                    // 让HibernateSessionFacoryl定到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;
        }

        /**
         * 关闭当前的SessionFactoryq且释放所有的资源
         */
        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();
        }
    }

     



    Ke 2007-08-29 19:12 发表评论
    ]]>
    վ֩ģ壺 ƽ| º| ѽ| | ֦| | ͼ| ǭ| ʡ| ¡| | | Ϫ| Һ| | ٹ| ͡| | | ߷| | | | | ͩ®| | ɽ| ʦ| | | ͼʲ| ɽ| ˮ| | | ʻ| ͼ| | | ƾ| Դ|