??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品区一区二区三含羞草,日韩在线看片,亚洲人成精品久久久久久http://www.aygfsteel.com/jdo/category/24568.htmlzh-cnSat, 18 Aug 2007 03:44:10 GMTSat, 18 Aug 2007 03:44:10 GMT60Hibernate应用pd之六扚w处理?/title><link>http://www.aygfsteel.com/jdo/articles/137712.html</link><dc:creator>蓝色q默</dc:creator><author>蓝色q默</author><pubDate>Fri, 17 Aug 2007 15:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/jdo/articles/137712.html</guid><wfw:comment>http://www.aygfsteel.com/jdo/comments/137712.html</wfw:comment><comments>http://www.aygfsteel.com/jdo/articles/137712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jdo/comments/commentRss/137712.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jdo/services/trackbacks/137712.html</trackback:ping><description><![CDATA[ <a target="_blank" title="Hibernate应用pd之六扚w处理? >http://tech.it168.com/j/e/2006-09-25/200609251710239.shtml</a> <img src ="http://www.aygfsteel.com/jdo/aggbug/137712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jdo/" target="_blank">蓝色q默</a> 2007-08-17 23:12 <a href="http://www.aygfsteel.com/jdo/articles/137712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate二~存ȝhttp://www.aygfsteel.com/jdo/articles/135788.html蓝色q默蓝色q默Fri, 10 Aug 2007 05:24:00 GMThttp://www.aygfsteel.com/jdo/articles/135788.htmlhttp://www.aygfsteel.com/jdo/comments/135788.htmlhttp://www.aygfsteel.com/jdo/articles/135788.html#Feedback0http://www.aygfsteel.com/jdo/comments/commentRss/135788.htmlhttp://www.aygfsteel.com/jdo/services/trackbacks/135788.htmlHibernate的二U缓存的Q今天终于忍不住了?

  我的l验主要来自hibernate2.1版本Q基本原理和3.0?.1是一LQ请原谅我的固不化?

  hibernate的session提供了一U缓存,每个sessionQ对同一个idq行两次loadQ不会发送两条sqll?a target="_blank">数据?/font>Q但是session关闭的时候,一U缓存就失效了?br />
  二~存是SessionFactoryU别的全局~存Q它底下可以使用不同的缓存类库,比如ehcache、oscache{,需要设|hibernate.cache.provider_classQ我们这里用ehcacheQ在2.1中就?hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider如果使用查询~存Q加上hibernate.cache.use_query_cache=true

  ~存可以单的看成一个MapQ通过key在缓存里面找value?br />
  Class的缓?/b>

  对于一条记录,也就是一个PO来说Q是Ҏ(gu)ID来找的,~存的key是IDQvalue是POJO。无论listQloadq是iterateQ只要读Z个对象,都会填充~存。但是list不会使用~存Q而iterate会先取数据库select id出来Q然后一个id一个id的loadQ如果在~存里面有,׃~存取,没有的话去数据库load。假设是d~存Q需要设|:

Qcache usage="read-write"/Q?

  如果你用的二~存实现是ehcache的话Q需要配|ehcache.XML

Qcache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" /Q?

  其中eternal表示~存是不是永q不时QtimeToLiveSeconds是缓存中每个元素Q这里也是一个POJOQ的时旉Q如果eternal="false"Q超q指定的旉Q这个元素就被移C。timeToIdleSeconds是发呆时_是可选的。当往~存里面put的元素超q?00个时Q如果overflowToDisk="true"Q就会把~存中的部分数据保存在硬盘上的时文仉面?

  每个需要缓存的class都要q样配置。如果你没有配置Qhibernate会在启动的时候警告你Q然后用defaultCache的配|,q样多个class会共享一个配|?

  当某个ID通过hibernate修改Ӟhibernate会知道,于是U除~存?

  q样大家可能会想Q同L查询条gQ第一ơ先listQ第二次再iterateQ就可以使用到缓存了。实际上q是很难的,因ؓ你无法判断什么时候是W一ơ,而且每次查询的条仉常是不一LQ假如数据库里面?00条记录,id??00Q第一ơlist的时候出了前50个idQ第二次iterate的时候却查询?0?0号idQ那?0-50是从~存里面取的Q?1?0是从数据库取的,共发?+20条sql。所以我一直认为iterate没有什么用QL会有1+N的问题?

  Q题外话Q有说法说大型查询用list会把整个l果集装入内存,很慢Q而iterate只select id比较好,但是大型查询L要分|的,谁也不会真的把整个结果集装进来,假如一?0条的话,iterate共需要执?1条语句,list虽然选择若干字段Q比iterateW一条select id语句慢一些,但只有一条语句,不装入整个结果集hibernateq会Ҏ(gu)数据库方a做优化,比如使用MySQL的limitQ整体看来应该还是list快。)

  如果惌对list或者iterate查询的结果缓存,p用到查询~存?br />
  查询~存

  首先需要配|hibernate.cache.use_query_cache=true

  如果用ehcacheQ配|ehcache.xmlQ注意hibernate3.0以后不是net.sf的包名了Q?br />
Qcache name="net.sf.hibernate.cache.StandardQueryCache"
maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"
timeToLiveSeconds="7200" overflowToDisk="true"/Q?
Qcache name="net.sf.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/Q?

  然后

query.setCacheable(true);//ȀzL询缓?
query.setCacheRegion("myCacheRegion");//指定要用的cacheRegionQ可?

  W二行指定要使用的cacheRegion是myCacheRegionQ即你可以给每个查询~存做一个单独的配置Q用setCacheRegion来做q个指定Q需要在ehcache.xml里面配置它:

Qcache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /Q?

  如果省略W二行,不设|cacheRegion的话Q那么会使用上面提到的标准查询缓存的配置Q也是Qnet.sf.hibernate.cache.StandardQueryCache

  对于查询~存来说Q缓存的key是根据hql生成的sqlQ再加上参数Q分늭信息Q可以通过日志输出看到Q不q它的输Z是很可读Q最好改一下它的代码)?

  比如hqlQ?

from Cat c where c.name like ?

  生成大致如下的sqlQ?

select * from cat c where c.name like ?

  参数?tiger%"Q那么查询缓存的key*大约*是这L字符Ԍ我是凭记忆写的,q不_Q不q看了也该明白了Q:

select * from cat c where c.name like ? , parameter:tiger%

  q样Q保证了同样的查询、同L参数{条件下h一Lkey?

  现在说说~存的valueQ如果是list方式的话Qvalue在这里ƈ不是整个l果集,而是查询出来的这一串ID。也是_不管是listҎ(gu)q是iterateҎ(gu)Q第一ơ查询的时候,它们的查询方式很它们qx的方式是一LQlist执行一条sqlQiterate执行1+N条,多出来的行ؓ是它们填充了~存。但是到同样条gW二ơ查询的时候,都和iterate的行Z样了Q根据缓存的keyȝ存里面查CvalueQvalue是一串idQ然后在到class的缓存里面去一个一个的load出来。这样做是ؓ了节U内存?

  可以看出来,查询~存需要打开相关cȝclass~存。list和iterateҎ(gu)W一ơ执行的时候,都是既填充查询缓存又填充class~存的?
q里q有一个很Ҏ(gu)被忽视的重要问题Q即打开查询~存以后Q即使是listҎ(gu)也可能遇?+N的问题!相同条gW一ơlist的时候,因ؓ查询~存中找不到Q不class~存是否存在数据QL发送一条sql语句到数据库获取全部数据Q然后填充查询缓存和class~存。但是第二次执行的时候,问题来了,如果你的class~存的超时时间比较短Q现在class~存都超时了Q但是查询缓存还在,那么listҎ(gu)在获取id串以后,会一个一个去数据库loadQ因此,class~存的超时时间一定不能短于查询缓存设|的时旉Q如果还讄了发呆时间的话,保证class~存的发呆时间也大于查询的缓存的生存旉。这里还有其他情况,比如class~存被程序强制evict了,q种情况p自己注意了?br />
  另外Q如果hql查询包含select字句Q那么查询缓存里面的value是整个l果集了?br />
  当hibernate更新数据库的时候,它怎么知道更新哪些查询~存呢?

  hibernate在一个地方维护每个表的最后更新时_其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配|里面?

  当通过hibernate更新的时候,hibernate会知道这ơ更新媄响了哪些表。然后它更新q些表的最后更新时间。每个缓存都有一个生成时间和q个~存所查询的表Q当hibernate查询一个缓存是否存在的时候,如果~存存在Q它q要取出~存的生成时间和q个~存所查询的表Q然后去查找q些表的最后更新时_如果有一个表在生成时间后更新q了Q那么这个缓存是无效的?

  可以看出Q只要更新过一个表Q那么凡是涉及到q个表的查询~存失效了Q因此查询缓存的命中率可能会比较低?br />
Collection~存

  需要在hbm的collection里面讄Q?br />
Qcache usage="read-write"/Q?

  假如class是CatQcollection叫childrenQ那么ehcache里面配置

Qcache name="com.xxx.pojo.Cat.children"
maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200"
overflowToDisk="true" /Q?

  Collection的缓存和前面查询~存的list一P也是只保持一串idQ但它不会因个表更新q就失效Q一个collection~存仅在q个collection里面的元素有增删时才失效?

  q样有一个问题,如果你的collection是根据某个字D|序的Q当其中一个元素更C该字D|Q导致顺序改变时Qcollection~存里面的顺序没有做更新?br />
  ~存{略

  只读~存Qread-onlyQ:没有什么好说的

  ?写缓存(read-writeQ?E序可能要的更新数据

  不严格的?写缓存(nonstrict-read-writeQ:需要更新数据,但是两个事务更新同一条记录的可能性很,性能比读写缓存好
事务~存QtransactionalQ:~存支持事务Q发生异常的时候,~存也能够回滚,只支持jta环境Q这个我没有怎么研究q?br />
  d~存和不严格d~存在实C的区别在于,d~存更新~存的时候会把缓存里面的数据换成一个锁Q其他事务如果去取相应的~存数据Q发现被锁住了,然后q接取数据?/font>查询?

  ?a target="_blank">Hibernate2.1的ehcache实现中,如果锁住部分~存的事务发生了异常Q那么缓存会一直被锁住Q直?0U后时?

  不严D写缓存不锁定~存中的数据?使用二~存的前|条件?br />
  你的hibernateE序Ҏ(gu)据库有独占的写访问权Q其他的q程更新了数据库Qhibernate是不可能知道的。你操作数据库必需直接通过hibernateQ如果你调用存储q程Q或者自׃?a target="_blank">JDBC更新数据库,hibernate也是不知道的。hibernate3.0的大扚w更新和删除是不更CU缓存的Q但是据?.1已经解决了这个问题?

  q个限制相当的棘手,有时候hibernate做批量更新、删除很慢,但是你却不能自己写jdbc来优化,很郁闷吧?

  SessionFactory也提供了U除~存的方法,你一定要自己写一些JDBC的话Q可以调用这些方法移除缓存,q些Ҏ(gu)是:

void evict(Class persistentClass)
Evict all entries from the second-level cache.
void evict(Class persistentClass, Serializable id)
Evict an entry from the second-level cache.
void evictCollection(String roleName)
Evict all entries from the second-level cache.
void evictCollection(String roleName, Serializable id)
Evict an entry from the second-level cache.
void evictQueries()
Evict any query result sets cached in the default query cache region.
void evictQueries(String cacheRegion)
Evict any query result sets cached in the named query cache region.

  不过我不q样做,因ؓq样很难l护。比如你现在用JDBC扚w更新了某个表Q有3个查询缓存会用到q个表,用evictQueries(String cacheRegion)U除?个查询缓存,然后用evict(Class persistentClass)U除了class~存Q看上去好像完整了。不q哪天你d了一个相x询缓存,可能会忘记更新这里的U除代码。如果你的jdbc代码到处都是Q在你添加一个查询缓存的时候,q知道其他什么地方也要做相应的改动吗Q?br />
  ȝQ?

  不要惛_然的以ؓ~存一定能提高性能Q仅仅在你能够驾驭它q且条g合适的情况下才是这L。hibernate的二U缓存限制还是比较多的,不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下ؕ用,可能会有1+N的问题。不当的使用q可能导致读数据?
如果受不了hibernate的诸多限Ӟ那么q是自己在应用程序的层面上做~存吧?

  在越高的层面上做~存Q效果就会越好。就好像管盘有缓存,数据库还是要实现自己的缓存,管数据库有~存Q咱们的应用E序q是要做~存。因为底层的~存它ƈ不知道高层要用这些数据干什么,只能做的比较通用Q而高层可以有针对性的实现~存Q所以在更高的别上做缓存,效果也要好些吧?

蓝色q默 2007-08-10 13:24 发表评论
]]>
Hibernate+Struts分页代码(节?http://www.aygfsteel.com/jdo/articles/134831.html蓝色q默蓝色q默Mon, 06 Aug 2007 16:47:00 GMThttp://www.aygfsteel.com/jdo/articles/134831.htmlhttp://www.aygfsteel.com/jdo/comments/134831.htmlhttp://www.aygfsteel.com/jdo/articles/134831.html#Feedback0http://www.aygfsteel.com/jdo/comments/commentRss/134831.htmlhttp://www.aygfsteel.com/jdo/services/trackbacks/134831.htmlpublic class HibernateUtil {    private Hi...  阅读全文

蓝色q默 2007-08-07 00:47 发表评论
]]>
[原创]Hibernate入门(1)http://www.aygfsteel.com/jdo/articles/134430.html蓝色q默蓝色q默Sat, 04 Aug 2007 12:20:00 GMThttp://www.aygfsteel.com/jdo/articles/134430.htmlhttp://www.aygfsteel.com/jdo/comments/134430.htmlhttp://www.aygfsteel.com/jdo/articles/134430.html#Feedback0http://www.aygfsteel.com/jdo/comments/commentRss/134430.htmlhttp://www.aygfsteel.com/jdo/services/trackbacks/134430.html 说明下,我也是新手,我现在的目的是ؓ了快速上手HibernateQ以下简UHQ,因此q没有作深入研究?/i>

参考资料:《Hibernate_Reference》、《深入浅出Hibernate?br />

正文

下面我们创Z个简单的Z控制台的(console-based)Hibernate应用E序?br />

我们所做的W一件事是创徏我们的开发目录,q且把所有需要用到的Java库文件放q去。万q的是我们有了myeclipseQ由他创建的工程可以很方便地打包Q然后交l另一个同h有myeclipse的用者,只需要简单的导入卛_使用^_^

右键工程目录 ?myeclipse ?Add Hibernate…?/u>

q样子你的工E就可以导入Hibernate所需要的所有库文gQ接下来我们创徏一个类Q用来代表那些我们希望储存在数据库里的event?


1.1
q里假设你已l拥有了一个数据库Qƈ且尽量将数据库中的各U关联设|完毕,如果你能q样子做Q接下来的事情将会变得非常简单^_^

打开透视图(perspectiveQ中的myeclipse database exploer

在里面我们要配置下数据源



完成后即可徏立连接,然后我们可以用myec自带的工兯行映配|,如下图:




1.2

一路默认即可,最后将会生成一堆配|的文g一共有3c:
1.持久化类Q就是一个带有一些属性(propertyQ的单JavaBeancdQ?br />
public abstract class AbstractTest implements java.io.Serializable {

    
// Fields

    
private Integer id;

    
private String name;

    
private Set<Testaddr> testaddr = new HashSet<Testaddr>(0);

    
public Set<Testaddr> getTestaddr() {
        
return testaddr;
    }

    
public void setTestaddr(Set<Testaddr> testaddr) {
        
this.testaddr = testaddr;
    }

    
/** default constructor */
    
public AbstractTest() {
    }

    
/** full constructor */
    
public AbstractTest(Integer id, String name) {
        
this.id = id;
        
this.name = name;
    }

    
// Property accessors

    
public Integer getId() {
        
return this.id;
    }

    
public void setId(Integer id) {
        
this.id = id;
    }

    
public String getName() {
        
return this.name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

}

你可以看到这个类对属性的存取Ҏ(gu)Qgetter and setter methodQ用了标准JavaBean命名U定Q同时把cd性(fieldQ的讉KU别设成U有的(privateQ。这是推荐的设计Q但q不是必ȝ?br />
2.xml映射配置

Hibernate需要知道怎样d载(loadQ和存储QstoreQ持久化cȝ对象。这正是Hibernate映射文g发挥作用的地斏V映文件告诉Hibernate它,应该讉K数据?database)里面的哪个表QtableQ及应该使用表里面的哪些字段QcolumnQ?

一个映文件的基本l构看v来像q样Q?/p>

<?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="HibernateFactory.Test" table="test"
        catalog
="himessage">
        
<id name="id" type="java.lang.Integer">
            
<column name="id" />
            
<generator class="native" />
        
</id>
        
<property name="name" type="java.lang.String">
            
<column name="name" not-null="true" />
        
</property>

        
<set name="testaddr" cascade="all" lazy="false" inverse="true">
            
<key column="test_id"></key>
            
<one-to-many class="HibernateFactory.Testaddr" />
        
</set>

    
</class>
</hibernate-mapping>

?code class="literal">hibernate-mapping标签QtagQ之? 含有一?code class="literal">class元素。所有的持久化实体类Q再ơ声明,或许接下来会有依赖类Q就是那些次要的实体Q都需要一个这L映射Q来把类对象映射到SQL数据库里的表?

id元素是标识符属性的声明Q?code class="literal">name="id" 声明了Java属性的名字 Q?Hibernate会?code class="literal">getId()?code class="literal">setId()来访问它?column属性则告诉Hibernate, 我们使用EVENTS表的哪个字段作ؓ主键。嵌套的generator元素指定了标识符生成{略Q在q里我们指定nativeQ它Ҏ(gu)已配|的数据库自动选择最佳的标识W生成策略。Hibernate支持由数据库生成Q全局唯一性(globally uniqueQ和应用E序指定Q或者你自己ZQ何已有策略所写的扩展Q这些策略来生成标识W?

关于具体的配|请参阅《深入浅出Hibernate》P146 数据兌Q所有的参数表请查此书P411

3.Hibernate配置
现在我们已经有了一个持久化cd它的映射文gQ该是配|Hibernate的时候了?br />
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    
<session-factory>
        
<property name="show_sql">true</property>
        
<property name="connection.username">root</property>
        
<property name="connection.url">
            jdbc:mysql://localhost/himessage?useUnicode=true
&amp;amp;characterEncoding=utf-8
        
</property>
        
<property name="dialect">
            org.hibernate.dialect.MySQLDialect
        
</property>
        
<property name="myeclipse.connection.profile">Hb</property>
        
<property name="connection.password">1234</property>
        
<property name="connection.driver_class">
            com.mysql.jdbc.Driver
        
</property>
        
<mapping resource="HibernateFactory/Admin.hbm.xml" />
        
<mapping resource="HibernateFactory/Test.hbm.xml" />
        
<mapping resource="HibernateFactory/Testaddr.hbm.xml" />

    
</session-factory>

</hibernate-configuration>

q里需要特别指出的?span style="color: rgb(0, 0, 0);"><property name="show_sql">true</property>
用了q句我们可以直接在ec控制台看?/font>
Hibernate生成的sql语句Q对调试E序是相当有帮助的!

CZ的基本框架完成了 Q?现在我们可以用Hibernate来做些真正的工作?

1.3
我们l于可以使用Hibernate来加载和存储对象了,~写一个带?code class="literal">main()Ҏ(gu)?code class="literal">AdminActionrc:
public class AdminAction {
    
public static void main(String[] args) {
        Session session 
= HibernateSessionFactory.getSession();
        session.beginTransaction();
        Admin admin = new Admin();
        admin.setEmail("tantan85@163.com");
        admin.setName("tantan");
    
    admin.setPsw("111111");
        admin.setAddAdmin(
2);
        session.save(admin);
        session.getTransaction().commit();
    }
}

我们创徏了个新的Admin对象q把它传递给Hibernate。现在Hibernate负责与SQL打交道,q把INSERT命o传给数据库。在q行之前Q让我们看一下处?code class="literal">Session?code class="literal">Transaction的代码?

一?code class="literal">Session是个单一的工作单元。我们暂时让事情单一些,q假设HibernateSession和数据库事务是一一对应的?br />HibernateSessionFactory.getSession()是干什么的呢?q回“当前的”工作单元?br />getTransaction()则表C取Z个事务对象,commit()则是事务的提交,卛_~存中的数据写入数据库?br />
是q么面向对象的方法,你就完成了传l的sql语句的功能,是不是很爽?更爽的是你还可以用hql语言来完成更强大的功能,当然q里不可能一一列DQ只有看书了Q请参考《深入浅出Hibernate》P173 ^_^


蓝色q默 2007-08-04 20:20 发表评论
]]>
[原创]Hibernateqo?/title><link>http://www.aygfsteel.com/jdo/articles/134423.html</link><dc:creator>蓝色q默</dc:creator><author>蓝色q默</author><pubDate>Sat, 04 Aug 2007 10:30:00 GMT</pubDate><guid>http://www.aygfsteel.com/jdo/articles/134423.html</guid><wfw:comment>http://www.aygfsteel.com/jdo/comments/134423.html</wfw:comment><comments>http://www.aygfsteel.com/jdo/articles/134423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jdo/comments/commentRss/134423.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jdo/services/trackbacks/134423.html</trackback:ping><description><![CDATA[最q在目中用了Struts + Hibernate的组合,在session和事务管理上遇到了些问题Q查阅了一些资料后Q决定采用servlet的过滤器来解决管理问题?br /><br />主要修改?span style="color: rgb(0, 0, 0);">HibernateSessionFactory.javaQ由原文件由myeclipse自动生成的)</span><span style="color: rgb(0, 0, 0);"></span><br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> HibernateSessionFactory {<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Location of hibernate.cfg.xml file. Location should be on the classpath<br />     * as Hibernate uses #resourceAsStream style lookup for its configuration<br />     * file. The default classpath location of the hibernate config file is in<br />     * the default package. Use #setConfigFile() to update the location of the<br />     * configuration file for the current session.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> String CONFIG_FILE_LOCATION </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/hibernate.cfg.xml</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br /><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);"> ThreadLocal</span><span style="color: rgb(0, 0, 0);"><</span><span style="color: rgb(0, 0, 0);">Session</span><span style="color: rgb(0, 0, 0);">></span><span style="color: rgb(0, 0, 0);"> threadLocal </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ThreadLocal</span><span style="color: rgb(0, 0, 0);"><</span><span style="color: rgb(0, 0, 0);">Session</span><span style="color: rgb(0, 0, 0);">></span><span style="color: rgb(0, 0, 0);">();<br /><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);"> ThreadLocal</span><span style="color: rgb(0, 0, 0);"><</span><span style="color: rgb(0, 0, 0);">Transaction</span><span style="color: rgb(0, 0, 0);">></span><span style="color: rgb(0, 0, 0);"> tLocaltx </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ThreadLocal</span><span style="color: rgb(0, 0, 0);"><</span><span style="color: rgb(0, 0, 0);">Transaction</span><span style="color: rgb(0, 0, 0);">></span><span style="color: rgb(0, 0, 0);">();<br /><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> Configuration configuration </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Configuration();<br /><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> org.hibernate.SessionFactory sessionFactory;<br /><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> String configFile </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> CONFIG_FILE_LOCATION;<br /><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> HibernateSessionFactory() {<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Returns the ThreadLocal Session instance. Lazy initialize the<br />     * <code>SessionFactory</code> if needed.<br />     * <br />     * </span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);"> Session<br />     * </span><span style="color: rgb(128, 128, 128);">@throws</span><span style="color: rgb(0, 128, 0);"> HibernateException<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> Session getSession() </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> HibernateException {<br />        Session session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (Session) threadLocal.get();<br /><br />        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (session </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">session.isOpen()) {<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (sessionFactory </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) {<br />                rebuildSessionFactory();<br />            }<br />            session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (sessionFactory </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"> sessionFactory.openSession() : </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />            threadLocal.set(session);<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> session;<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Rebuild hibernate session factory<br />     * <br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> rebuildSessionFactory() {<br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />            configuration.configure(configFile);<br />            sessionFactory </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> configuration.buildSessionFactory();<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (Exception e) {<br />            System.err.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">%%%% Error Creating SessionFactory %%%%</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            e.printStackTrace();<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Close the single hibernate session instance.<br />     * <br />     * </span><span style="color: rgb(128, 128, 128);">@throws</span><span style="color: rgb(0, 128, 0);"> HibernateException<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> closeSession() </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> HibernateException {<br />        Session session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (Session) threadLocal.get();<br />        threadLocal.set(</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">);<br /><br />        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (session </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) {<br />            session.close();<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * return session factory<br />     * <br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> org.hibernate.SessionFactory getSessionFactory() {<br />        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> sessionFactory;<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * return session factory<br />     * <br />     * session factory will be rebuilded in the next call<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> setConfigFile(String configFile) {<br />        HibernateSessionFactory.configFile </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> configFile;<br />        sessionFactory </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * return hibernate configuration<br />     * <br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> Configuration getConfiguration() {<br />        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> configuration;<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * 打开一个事?br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> beginTransaction() {<br />        Transaction tx </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> tLocaltx.get();<br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (tx </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) {<br />                tx </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> getSession().beginTransaction();<br />                tLocaltx.set(tx);<br />            }<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (Exception e) {<br />            System.err.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">%%%% Error beginTransaction %%%%</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            e.printStackTrace();<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * 关闭一个事?br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> commitTransaction() {<br />        Transaction tx </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> tLocaltx.get();<br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (tx </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&&</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">tx.wasCommitted() </span><span style="color: rgb(0, 0, 0);">&&</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">tx.wasRolledBack()) {<br />                tx.commit();<br />                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">一个事务结束就立即解除与tLocaltx的关?/span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">                tLocaltx.set(</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">);<br />            }<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (Exception e) {<br />            System.err.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">%%%% Error commitTransaction %%%%</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            e.printStackTrace();<br />        }<br />    }<br />    <br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * 事务回滚<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> rollbackTransaction() {<br />        Transaction tx </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> tLocaltx.get();<br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />            tLocaltx.set(</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">);<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (tx </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&&</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">tx.wasCommitted() </span><span style="color: rgb(0, 0, 0);">&&</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">tx.wasRolledBack()) <br />                tx.rollback();<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (Exception e) {<br />            System.err.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">%%%% Error rollbackTransaction %%%%</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            e.printStackTrace();<br />        }<br />    }<br />}</span></div><br /><span style="color: rgb(0, 0, 0);">在myec生成的HibernateSessionFactory源代?/span>中,保证了在一ơ请求过E中׃n单一的session实例Q我们现在要加入的内容就是在一ơ请求中׃n一?span style="color: rgb(0, 0, 0);">Transaction实例Q?/span>很明显,中文部分是增加的内容。添加的代码装了事务的开始,提交以及回滚。这样子session?span style="color: rgb(0, 0, 0);">Transaction实例可以跨越一ơ请求的多种Ҏ(gu)Q这有助于实现集合的延迟加蝲{?/span><span style="color: rgb(0, 0, 0);">HibernateҎ(gu)?br /><br />在用的时候,我们应该用封装后?/span>事务Ҏ(gu)和sessionҎ(gu)Q用方法如下:<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">获得唯一的session 实例</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">Session session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> HibernateSessionFactory.getSession();<br /><br />HibernateSessionFactory.beginTransaction();<br /></span><span style="color: rgb(0, 128, 0);">//do something……(</span><span style="color: rgb(0, 128, 0);">数据库操作如Q添加、删除等Q?/span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">HibernateSessionFactory.commitTransaction();</span></div><br />在我们的目中,BaseDAOcd装了<span style="color: rgb(0, 0, 0);">Hibernate常用的数据库操作Ҏ(gu)Q其?/span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);">HibernateSessionFactory.beginTransaction()已经一起封入了</span>BaseDAOc,于是Q我们便不用在用代码中加入事务开始的Ҏ(gu)Q直接调?span style="color: rgb(0, 0, 0);"></span>BaseDAOcȝҎ(gu)卛_。在调试q程中,如果我们需要测试数据是否能够写入数据库Q就应该手工调用事务l束Ҏ(gu)<span style="color: rgb(0, 0, 0);">HibernateSessionFactory.commitTransaction()Q即可立?/span>写入数据库?br /><br /><b>注意Q在一ơ业务逻辑中,只能用一ơ事务提交,也只需要一ơ事务提交,我们一般把事务提交攑ֈ语句执行的最后面。(如果你用了多ơ提交,只对W一ơ提交有效!Q?/b><br /><br /><span style="color: rgb(0, 0, 0);">下面举例Q?br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">testDAO l承 BaseDAO </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class </span><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 0);">test</span></span><span style="color: rgb(0, 0, 0);">DAO </span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);"> BaseDAO {<br />    </span><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 255);"></span><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 0);">test</span></span><span style="color: rgb(0, 0, 0);">DAO</span></span><span style="color: rgb(0, 0, 0);">(){<br />        </span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">();<br />    }<br />}</span></div><br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> testAction {<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> main(String[] args) {<br />        ActionDAO ad </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ActionDAO();<br />        ad.add(object);<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 手工调用事务提交Q可缓存中的数据立卛_入数据库</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        HibernateSessionFactory.commitTransaction();<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 手工调用session关闭</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        HibernateSessionFactory.closeSession();<br />    }<br />}<br /></span></div><br />但在实际的应用中Q我们应该把试用的手工代码删除Q因Z务和session的关闭还有事务的回滚是通过qo器来完成的,当然qo器需要servlet</span>的支持,我们先来看看qo器的代码Q?br /><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 128, 0);"></span></span><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> CloseSessionFilter </span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);"> HttpServlet </span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);"> Filter {</span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * <br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> serialVersionUID </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1L</span><span style="color: rgb(0, 0, 0);">;<br /><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> FilterConfig filterConfig;<br /><br />    </span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> enable; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 是否L此过滤器</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> init(FilterConfig filterConfig) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> ServletException {<br />        </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.filterConfig </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> filterConfig;<br />        loadConfigParams();<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> loadConfigParams() { </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 取得初始化参?/span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        String enableStr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.filterConfig.getInitParameter(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">enable</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (enableStr.trim().equals(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)) {<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.enable </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />        } </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> {<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.enable </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Process the request/response pair</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) {<br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />            filterChain.doFilter(request, response);<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (Exception sx) {<br />        } </span><span style="color: rgb(0, 0, 255);">finally</span><span style="color: rgb(0, 0, 0);"> {<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (enable) {<br />                </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />                    HibernateSessionFactory.commitTransaction();<br />                } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (Exception e) {<br />                    HibernateSessionFactory.rollbackTransaction();<br />                } </span><span style="color: rgb(0, 0, 255);">finally</span><span style="color: rgb(0, 0, 0);"> {<br />                    HibernateSessionFactory.closeSession();<br />                }<br />            }<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Clean up resources</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> destroy() {<br />    }<br />}</span></div><br />相应的web.xml配置Q?br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);"><!--</span><span style="color: rgb(0, 128, 0);"> qo器 settings: </span><span style="color: rgb(0, 128, 0);">--></span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">CloseSessionFilter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />            com.struts.common.CloseSessionFilter<br />        </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">enable</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />    <br />    </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 255);"></span><span style="color: rgb(0, 0, 0);">CloseSessionFilter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">action</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span></div><br /><br />需要注意的是多个过滤器之间的顺序位|,<span style="color: rgb(0, 0, 0);">filterChain.doFilter(request, response);是指调用下一个过滤器Q也是_要调用完所有过滤器后,才会l箋q行</span><span style="color: rgb(0, 0, 0);">filterChain.doFilter(request, response);下面的内容,q是一个递归的过E。所以,在web.xml的配|中Q我们要?/span><span style="color: rgb(0, 0, 0);">Hibernateqo器放在第一位,保所有servletq行完毕后,才调用最后的关闭Ҏ(gu)?br /><br /><br /></span><span style="color: rgb(0, 0, 0);"></span><img src ="http://www.aygfsteel.com/jdo/aggbug/134423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jdo/" target="_blank">蓝色q默</a> 2007-08-04 18:30 <a href="http://www.aygfsteel.com/jdo/articles/134423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>myeclipse试用记----多对一单向兌Q?Q?/title><link>http://www.aygfsteel.com/jdo/articles/133881.html</link><dc:creator>蓝色q默</dc:creator><author>蓝色q默</author><pubDate>Wed, 01 Aug 2007 15:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/jdo/articles/133881.html</guid><wfw:comment>http://www.aygfsteel.com/jdo/comments/133881.html</wfw:comment><comments>http://www.aygfsteel.com/jdo/articles/133881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jdo/comments/commentRss/133881.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jdo/services/trackbacks/133881.html</trackback:ping><description><![CDATA[     摘要: 转自Qhttp://lavasoft.blog.51cto.com/62575/d-5 说明Q一个客户可以对应多个订单。以此ؓ例说明用myeclipse如何来实现这个应用,看看myeclipse是如何做的,生成配置文g质量如何?  环境Q?开发工Pmyeclipse 5.5.1 GA ??库:mysql-5.0.37 操作pȝQwindows xp profess...  <a href='http://www.aygfsteel.com/jdo/articles/133881.html'>阅读全文</a><img src ="http://www.aygfsteel.com/jdo/aggbug/133881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jdo/" target="_blank">蓝色q默</a> 2007-08-01 23:59 <a href="http://www.aygfsteel.com/jdo/articles/133881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ຣʡ</a>| <a href="http://" target="_blank">ʤ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">޻</a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">廪</a>| <a href="http://" target="_blank">ء</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">峣</a>| <a href="http://" target="_blank">̫ԭ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʼ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ʊ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">³ľ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ҵ</a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank">ָ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ȩ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>