??xml version="1.0" encoding="utf-8" standalone="yes"?>精品精品导航,成人福利在线观看视频,波多野结衣一区二区http://www.aygfsteel.com/wuxufeng8080/category/12030.html弱水三千Q只取一瓢,便能解(f)Q佛(jng)法无边,奉行一法,便能得益?/description>zh-cnWed, 22 Feb 2012 21:37:43 GMTWed, 22 Feb 2012 21:37:43 GMT60[转]谈Hibernate的flush机制http://www.aygfsteel.com/wuxufeng8080/archive/2012/02/22/370514.html风h?/dc:creator>风h?/author>Wed, 22 Feb 2012 05:11:00 GMThttp://www.aygfsteel.com/wuxufeng8080/archive/2012/02/22/370514.html

谈Hibernate的flush机制

随着Hibernate在Java开发中的广泛应用,我们在用Hibernateq行对象持久化操作中也遇C各种各样的问题。这些问题往往都是我们对Hibernate~Z了解所_(d)q里我讲个我从前遇到的问题及(qing)一些想法,希望能给大家一点借鉴?br />
      q是在一ơ事务提交时遇到的异常?br />       an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
net.sf.hibernate.AssertionFailure: possible nonthreadsafe access to session
注:(x)非possible non-threadsafe access to the session Q那是另外的错误Q类g不一P
      q个异常应该很多的朋友都遇到q,原因可能各不相同。但所有的异常都应该是在flush或者事务提交的q程中发生的。这一般由我们在事务开始至事务提交?q程中进行了不正的操作DQ也?x)在多线E同时操作一个Session时发生,q里我们仅仅讨论单线E的情况Q多U程除了U程同步外基本与此相同?br />       至于具体是什么样的错误操作那Q我l大家看一个例子(假设Hibernate配置正确Qؓ(f)保持代码z,不引入包?qing)处理Q何异常)
SessionFactory sf = new Configuration().configure().buildSessionFactory() ;
Session s = sf.openSession();
Cat cat = new Cat();
Transaction tran = s.beginTransaction(); (1)
s.save(cat); (2)Q此处同样可以ؓ(f)update deleteQ?br /> s.evict(cat); (3)
tran.commit(); (4)
s.close();(5)
      q就是引h异常的典型错误。我当时遇Cq个异常Q检查代码时Ҏ(gu)没感觉到q段代码Z问题Q想当然的认为在Session上开始一个事务,通过 Session对象存入数据库Q再这个对象从Session上拆,提交事务Q这是一个很正常的流E。如果这里正常的话,那问题一定在别处?
        问题恰恰在q里Q我的想法也许没有错Q但是一个错误的论据所引出的观Ҏ(gu)q都不可能是正确的。因为我一直以为直接在Ҏ(gu)据库q行操作Q忘C在我与数?库之间隔了一个HibernateQHibernate在ؓ(f)我们提供持久化服务的同时Q也改变了我们对数据库的操作方式Q这U方式与我们直接的数据库操作 有着很多的不同,正因为我们对q种方式没有一个大致的了解造成了我们的应用q未得到预先设想的结果?br /> 那Hibernate的持久化机制到底有什么不同那Q简单的_(d)Hibernate在数据库层之上实C一个缓存区Q当应用save或者update一?对象ӞHibernateq未这个对象实际的写入数据库中Q而仅仅是在缓存中Ҏ(gu)应用的行为做了登讎ͼ在真正需要将~存中的数据flush入数据库?才执行先前登记的所有行为?br /> 在实际执行的q程中,每个Session是通过几个映射和集合来l护所有与该Session建立了关联的对象以及(qing)应用对这些对象所q行的操作的Q与我们q?ơ讨论有关的有entityEntriesQ与Session相关联的对象的映)、insertionsQ所有的插入操作集合Q?deletionsQ删除操作集合)、updatesQ更新操作集合)。下面我开始解释在最开始的例子中,Hibernate到底是怎样q作的?br /> (1)生成一个事务的对象Qƈ标记当前的Session处于事务状态(注:(x)此时q未启动数据库事务Q?br /> (2)应用使用s.save保存cat对象Q这个时候Sessioncatq个对象攑օentityEntriesQ用来标记cat已经和当前的?x)话?立了兌Q由于应用对cat做了保存的操作,Sessionq要在insertions中登记应用的q个插入行ؓ(f)Q行为包括:(x)对象引用、对象id?Session、持久化处理c)?br /> (3)s.evict(cat)cat对象从s?x)话中拆,q时s?x)从entityEntries中将catq个对象Ud?br /> (4)事务提交Q需要将所有缓存flush入数据库QSession启动一个事务,q按照insert,update,……,delete的顺序提交所?之前登记的操作(注意Q所有insert执行完毕后才?x)执行updateQ这里的Ҏ(gu)处理也可能会(x)你的程序搞得一团糟Q如需要控制操作的执行序Q要?于用flushQ,现在cat不在entityEntries中,但在执行insert的行为时只需要访问insertionsp够了Q所以此时不?有Q何的异常。异常出现在插入后通知Session该对象已l插入完毕这个步骤上Q这个步骤中需要将entityEntries中cat?existsInDatabase标志|ؓ(f)trueQ由于catq不存在于entityEntries中,此时Hibernatep?insertions和entityEntries可能因ؓ(f)U程安全的问题生了不同步(也不知道Hibernate的开发者是否考虑C子中的处理方 式,如果没有的话Q这也许是一个bug吧)Q于是一个net.sf.hibernate.AssertionFailurep抛出Q程序终止?br />
我想现在大家应该明白例子中的E序到底哪里有问题了吧,我们的错误的认ؓ(f)s.save?x)立即的执行Q而将cat对象q早的与Session拆离Q造成?Session的insertions和entityEntries中内容的不同步。所以我们在做此cL作时一定要清楚Hibernate什么时候会(x)数 据flush入数据库Q在未flush之前不要已q行操作的对象从Session上拆R?br />
对于q个错误的解x法是Q我们可以在(2)?3)之间插入一个s.flush()强制Session缓存中的数据flush入数据库Q此?Hibernate?x)提前启动事务,?2)中的save登记的insert语句登记在数据库事务中,q将所有操作集合清I)Q这样在(4)事务提交?insertions集合已l是I的了,即我们拆离了cat也不?x)有M的异怺?br /> 前面单的介绍了一下Hibernate的flush机制和对我们E序可能带来的媄响以?qing)相应的解决?gu)QHibernate的缓存机制还?x)在其他的方面给我们的程序带来一些意想不到的影响。看下面的例子:(x)
Qname为cat表的主键Q?br /> Cat cat = new Cat();
cat.setName(“tom”);
s.save(cat);
cat.setName(“mary”);
s.update(cat);(6)
Cat littleCat = new Cat();
littleCat.setName(“tom”);
s.save(littleCat);
s.flush();
q个例子看v来有什么问题?估计不了解Hibernate~存机制的h多半?x)说没有问题Q但它也一样不能按照我们的思\正常q行Q在flushq程中会(x)?生主键冲H,可能你想问:(x)“在save(littleCat)之前不是已经更改cat.nameq已l更C么?Z么还?x)发生主键冲H那Q?#8221;q里的原?是我在解释W一个例子时所提到的缓存flush序的问题,Hibernate按照insert,update,……,delete的顺序提交所有登?的操作,所以你的s.update(cat)虽然在程序中出现在s.save(littleCat)之前Q但是在flush的过E中Q所有的save都将 在update之前执行Q这造成了主键冲H的发生?br /> q个例子中的更改Ҏ(gu)一h?6)之后加入s.flush()强制Session在保存littleCat之前更新cat的name。这样在W二?flush时就只会(x)执行s.save(littleCat)q次登记的动作,q样׃?x)出C键冲H的状况。再看一个例子(很奇怪的例子Q但是能够说明问 题)
Cat cat = new Cat();
cat.setName(“tom”);
s.save(cat); (7)
s.delete(cat);(8)
cat.id=null;(9)
s.save(cat);(10)
s.flush();
q个例子在运行时?x)生异常net.sf.hibernate.HibernateException: identifier of an instance of Cat altered from 8b818e920a86f038010a86f03a9d0001 to nullq里例子也是有关于缓存的问题Q但是原因稍有不同:(x)Q?Q和Q?Q的处理相同。(8QSession?x)在deletions中登记这个删除动作,同时更新entityEntries中该对象的登记状态ؓ(f)DELETED。(9QCatcȝ标识W字Dؓ(f)id,其|ؓ(f)null便于重新分配idq保存进数据库?
Q?0Q此时Session?x)首先在entityEntries查找cat对象是否曄与Session做过兌Q因为cat只改变了属性|引用q未?变,所以会(x)取得状态ؓ(f)DELETED的那个登记对象。由于第二次保存的对象已l在当前Session中删除,save?x)强制Session缓?flush才会(x)l箋Qflush的过E中首先要执行最开始的save动作Q在q个save中检查了catq个对象的id是否与原来执行动作时的id相同?不幸的是Q此时cat的id被赋为nullQ异常被抛出Q程序终止(此处要注意,我们在以后的开发过E尽量不要在flush之前改变已经q行了操作的对象 的idQ?
q个例子中的错误也是׃~存的g时更新造成的(当然Q与不正规的使用Hibernate也有关系Q,处理Ҏ(gu)有两U:(x)
1、在Q?Q之后flushQ这样就可以保证Q?0Q处savecat作ؓ(f)一个全新的对象q行保存?
2、删除(9Q,q样W二ơsave所引v的强制flush可以正常的执行,在数据库中插入cat对象后将其删除,然后l箋W二ơsave重新插入cat对象Q此时cat的id仍与从前一致?br /> q两U方法可以根据不同的需要来使用Q呵呵,总觉得好像是很不正规的方式来解决问题Q但是问题本w也不够正规Q只希望能够在应用开发中l大家一些帮助,不对的地方也希望各位l与指正?br />   ȝ来说Q由于Hibernate的flush处理机制Q我们在一些复杂的对象更新和保存的q程中就要考虑数据库操作顺序的改变以及(qing)延时flush?否对E序的结果有影响。如果确实存在着影响Q那可以在需要保持这U操作顺序的位置加入flush强制Hibernate缓存中记录的操作flush?数据库,q样看v来也怸太美观,但很有效?/div>
?
http://hi.baidu.com/lkdlhw_2000/blog/item/a35b9cca82945342f31fe769.html


]]>
hibernate 兌查询错误QPath expected for joinQ?/title><link>http://www.aygfsteel.com/wuxufeng8080/archive/2009/12/10/305411.html</link><dc:creator>风h?/dc:creator><author>风h?/author><pubDate>Thu, 10 Dec 2009 06:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/wuxufeng8080/archive/2009/12/10/305411.html</guid><wfw:comment>http://www.aygfsteel.com/wuxufeng8080/comments/305411.html</wfw:comment><comments>http://www.aygfsteel.com/wuxufeng8080/archive/2009/12/10/305411.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wuxufeng8080/comments/commentRss/305411.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wuxufeng8080/services/trackbacks/305411.html</trackback:ping><description><![CDATA[    以前没怎么用,现在真用h的时候还是会(x)有很多白痴问题,哈?br />     今天惛_一个left join Q?兌关系应该是已l配好了Q但是调用hql是报错Q也不知道怎么回事。l研Iing? <img src ="http://www.aygfsteel.com/wuxufeng8080/aggbug/305411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wuxufeng8080/" target="_blank">风h?/a> 2009-12-10 14:00 <a href="http://www.aygfsteel.com/wuxufeng8080/archive/2009/12/10/305411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HibernateM数据的操?/title><link>http://www.aygfsteel.com/wuxufeng8080/archive/2009/11/17/302733.html</link><dc:creator>风h?/dc:creator><author>风h?/author><pubDate>Tue, 17 Nov 2009 11:30:00 GMT</pubDate><guid>http://www.aygfsteel.com/wuxufeng8080/archive/2009/11/17/302733.html</guid><wfw:comment>http://www.aygfsteel.com/wuxufeng8080/comments/302733.html</wfw:comment><comments>http://www.aygfsteel.com/wuxufeng8080/archive/2009/11/17/302733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wuxufeng8080/comments/commentRss/302733.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wuxufeng8080/services/trackbacks/302733.html</trackback:ping><description><![CDATA[struts2+spring2.5+hibernate 3.3<br /> <br /> 在hibernate的操作中Q特别是M数据的操作?br /> <br /> 一般有q么几个地方需要注意,以前也一直没有拿hibernate好好用过Q现在真正用hQ问题还是挺多了。这几天一直在调试解释q种问题?br /> <br /> L据中的一对一兌Q这里的兌数据从页面提交的时候是否可以直接映到L据对象中Q暂时不清楚Q可以测试一下?br /> <br /> 然后是明l数据的操作Q现在动态生的行数据,然后手动解析Q生成明l对象。整个过E个人感觉比较麻烦,暂时也想不出有什么好的解x案?br /> <br /> q里在联保存数据的时候,首先要清除掉原来的明l数据,然后再把面提交q来的数据加上?br /> 不知道一般是不是q样弄的。否则没法清楚原来的数据?br /> <br /> <br /> <img src ="http://www.aygfsteel.com/wuxufeng8080/aggbug/302733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wuxufeng8080/" target="_blank">风h?/a> 2009-11-17 19:30 <a href="http://www.aygfsteel.com/wuxufeng8080/archive/2009/11/17/302733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate annotion 注解攑֜属性上或者方法上http://www.aygfsteel.com/wuxufeng8080/archive/2009/08/04/289712.html风h?/dc:creator>风h?/author>Tue, 04 Aug 2009 01:54:00 GMThttp://www.aygfsteel.com/wuxufeng8080/archive/2009/08/04/289712.htmlhttp://www.aygfsteel.com/wuxufeng8080/comments/289712.htmlhttp://www.aygfsteel.com/wuxufeng8080/archive/2009/08/04/289712.html#Feedback0http://www.aygfsteel.com/wuxufeng8080/comments/commentRss/289712.htmlhttp://www.aygfsteel.com/wuxufeng8080/services/trackbacks/289712.html两种方式都是可以Q但是看人家的代码,?fn)惯注解放于方法上Q不知道有没有什么好的地方?

现在唯一发现的区别就是,@Transient非持久化域的不同?br /> 攑֜Ҏ(gu)上,只需要标记那个getterҎ(gu)卛_Q可以没有对应属性?br />
如果攑֜属性上Q需要生成getter 和setterҎ(gu)


在实体对象中Q可能存在很多非持久化方法,q种情况?br /> 注解|于属性上Q功能性getҎ(gu)Q可以没有对应属性?br /> 注解至于Ҏ(gu)上,直接使用@Transient?br />
两者基本上都一栗?br /> 只是在用的时?span style="color: red">不能混合使用?br />

]]>
Hibernate annotion配置http://www.aygfsteel.com/wuxufeng8080/archive/2009/08/04/289703.html风h?/dc:creator>风h?/author>Tue, 04 Aug 2009 00:52:00 GMThttp://www.aygfsteel.com/wuxufeng8080/archive/2009/08/04/289703.htmlhttp://www.aygfsteel.com/wuxufeng8080/comments/289703.htmlhttp://www.aygfsteel.com/wuxufeng8080/archive/2009/08/04/289703.html#Feedback0http://www.aygfsteel.com/wuxufeng8080/comments/commentRss/289703.htmlhttp://www.aygfsteel.com/wuxufeng8080/services/trackbacks/289703.html
1、一对多
2、一对一

常见异常?qing)处?br /> 1?span style="color: red">Could not determine type for: java.util.Set
说不能找到这个类型,无法创徏?br /> 原因Qannotion不能同时攑֜属性和Ҏ(gu)上,要么都放在属性上Q或者都攑֜Ҏ(gu)?

]]>
hibernate 延迟加蝲的错?failed to lazily initialize a collection of rolehttp://www.aygfsteel.com/wuxufeng8080/archive/2008/07/05/212712.html风h?/dc:creator>风h?/author>Sat, 05 Jul 2008 01:54:00 GMThttp://www.aygfsteel.com/wuxufeng8080/archive/2008/07/05/212712.htmlhttp://www.aygfsteel.com/wuxufeng8080/comments/212712.htmlhttp://www.aygfsteel.com/wuxufeng8080/archive/2008/07/05/212712.html#Feedback1http://www.aygfsteel.com/wuxufeng8080/comments/commentRss/212712.htmlhttp://www.aygfsteel.com/wuxufeng8080/services/trackbacks/212712.html 1、设|lazy=false
如果是用annotationQ则配置如下
@OneToMany(
   targetEntity = CourseAuthorizationItem.class,
   cascade = {CascadeType.PERSIST, CascadeType.MERGE},
   mappedBy = "course", fetch=FetchType.EAGER
  )
fetchcd讄成直接获?br />
2、就是用filterQ过滤所有的链接
如果在用filter的时候,要配|事务处理,否则?x)导致session处于只读状态而不能做修改、删除的动作

<web-app>

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate.support.OpenSessionInViewFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

</web-app>

]]>
վ֩ģ壺 | | | ɽ| ӯ| ̽| ˮ| ϻ| | Ǩ| | կ| | | | | | | | | | | | κ| | ˳| ʻ| ɽ| | | Ů| ¡| | | | | | Ȫ| ֹ| ͤ| ͬ|