﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-honzeland-随笔分类-Hibernate</title><link>http://www.blogjava.net/honzeland/category/43478.html</link><description>记录点滴。。。</description><language>zh-cn</language><lastBuildDate>Sat, 09 Oct 2010 05:20:35 GMT</lastBuildDate><pubDate>Sat, 09 Oct 2010 05:20:35 GMT</pubDate><ttl>60</ttl><item><title>GWT 2 Spring 3 JPA 2 Hibernate 3.5 Tutorial – Eclipse and Maven 2 showcase </title><link>http://www.blogjava.net/honzeland/archive/2010/08/20/329452.html</link><dc:creator>honzeland</dc:creator><author>honzeland</author><pubDate>Fri, 20 Aug 2010 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/honzeland/archive/2010/08/20/329452.html</guid><wfw:comment>http://www.blogjava.net/honzeland/comments/329452.html</wfw:comment><comments>http://www.blogjava.net/honzeland/archive/2010/08/20/329452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honzeland/comments/commentRss/329452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honzeland/services/trackbacks/329452.html</trackback:ping><description><![CDATA[See details at:&nbsp;<a href="http://www.javacodegeeks.com/2010/07/gwt-2-spring-3-jpa-2-hibernate-35.html">http://www.javacodegeeks.com/2010/07/gwt-2-spring-3-jpa-2-hibernate-35.html</a>
<div><a href="http://gae-java-persistence.blogspot.com/2010/03/executing-simple-joins-across-owned.html" style="color: #333333; text-decoration: none; display: inline !important; font-weight: normal; font-family: Georgia, serif; font-size: 26px; line-height: 36px; "><span style="font-size: 10pt; "></span></a><span style="font-size: 14pt; "><a href="http://gae-java-persistence.blogspot.com/2010/03/executing-simple-joins-across-owned.html" style="color: #333333; text-decoration: none; display: inline !important; font-weight: normal; font-family: Georgia, serif; font-size: 26px; line-height: 36px; "><span style="font-size: 10pt; "></span></a><span style="font-size: 12pt; "><a href="http://gae-java-persistence.blogspot.com/2010/03/executing-simple-joins-across-owned.html" style="color: #333333; text-decoration: none; display: inline !important; font-weight: normal; font-family: Georgia, serif; font-size: 26px; line-height: 36px; "><span style="font-size: 10pt; "><span style="font-size: 12pt; ">Executing Simple Joins Across Owned Relationships</span></span></a>&nbsp;for gae:&nbsp;<a href="http://gae-java-persistence.blogspot.com/2010/03/executing-simple-joins-across-owned.html">http://gae-java-persistence.blogspot.com/2010/03/executing-simple-joins-across-owned.html</a></span><a href="http://gae-java-persistence.blogspot.com/2010/03/executing-simple-joins-across-owned.html"></a></span><a href="http://gae-java-persistence.blogspot.com/2010/03/executing-simple-joins-across-owned.html"></a></div>
<img src ="http://www.blogjava.net/honzeland/aggbug/329452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honzeland/" target="_blank">honzeland</a> 2010-08-20 13:01 <a href="http://www.blogjava.net/honzeland/archive/2010/08/20/329452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Annotations</title><link>http://www.blogjava.net/honzeland/archive/2010/04/20/318875.html</link><dc:creator>honzeland</dc:creator><author>honzeland</author><pubDate>Tue, 20 Apr 2010 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/honzeland/archive/2010/04/20/318875.html</guid><wfw:comment>http://www.blogjava.net/honzeland/comments/318875.html</wfw:comment><comments>http://www.blogjava.net/honzeland/archive/2010/04/20/318875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honzeland/comments/commentRss/318875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honzeland/services/trackbacks/318875.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Use one single table "</span><span style="color: #000000;">blank_fields</span><span style="color: #000000;">" for both A and B. "blank_fields" has fields: 'ref_id', 'blank_field', 'type'. 'type' is used to identify which entity the record belongs to. Use 'type' + 'ref_id' to specify the collection of elements for one entity.<br />
<br />
@Entity<br />
@Table(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">table_a</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BlankField</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;blankFields&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashSet</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BlankField</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@CollectionOfElements<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Fetch(FetchMode.SUBSELECT)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Enumerated(EnumType.ORDINAL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinTable(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">blank_fields</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;joinColumns&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;@JoinColumn(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ref_id</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Cascade(value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;org.hibernate.annotations.CascadeType.DELETE_ORPHAN)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Column(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">blank_field</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;nullable&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@SQLInsert(sql&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">INSERT&nbsp;INTO&nbsp;blank_fields(ref_id,&nbsp;blank_field,&nbsp;type)&nbsp;VALUES(?,?,0)</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Where(clause&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">type=0</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BlankField</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;getBlankFields()&nbsp;{ // BlankField is an enum<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;blankFields;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings(</span><span style="color: #000000;">"</span><span style="color: #000000;">unused</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setBlankFields(Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BlankField</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;blankFields)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.blankFields&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;blankFields;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;End&nbsp;B</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
@Entity<br />
@Table(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">table_b</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;B&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BlankField</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;blankFields&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashSet</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BlankField</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@CollectionOfElements<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Fetch(FetchMode.SUBSELECT)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Enumerated(EnumType.ORDINAL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinTable(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">blank_fields</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;joinColumns&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;@JoinColumn(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ref_id</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Cascade(value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;org.hibernate.annotations.CascadeType.DELETE_ORPHAN)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Column(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">blank_field</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;nullable&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@SQLInsert(sql&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">INSERT&nbsp;INTO&nbsp;blank_fields(ref_id,&nbsp;blank_field,&nbsp;type)&nbsp;VALUES(?,?,1)</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;used&nbsp;for&nbsp;insert</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@Where(clause&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">type=1</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;used&nbsp;for&nbsp;query,&nbsp;if&nbsp;not&nbsp;@CollectionOfElements,&nbsp;such&nbsp;as&nbsp;@OneToMany,&nbsp;use&nbsp;@WhereJoinTable&nbsp;instead</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BlankField</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;getBlankFields()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;blankFields;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings(</span><span style="color: #000000;">"</span><span style="color: #000000;">unused</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setBlankFields(Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BlankField</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;blankFields)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.blankFields&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;blankFields;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
当然还有其他的方式来实现上面的需求，上面采用的单表来记录不同实体的associations（这儿是CollectionOfElements，并且返回的是Set&lt;Enum&gt;，不是Set&lt;Embeddable&gt;)，然后用'type'来区分不同的实体，这样做的好处是：数据库冗余少，易于扩展，对于新的实体，只需加一个type值，而不需更改数据库表结构。另外一种采用单表的方式是为每个实体增加新的字段，如</span><span style="color: #000000;">"blank_fields": 'a_id', 'b_id', 'blank_field', a_id reference table_a (id), b_id reference table_b (id). 这样在映射的时候更简单，<br />
对于A，映射为<br />
</span><span style="color: #000000;">@JoinTable(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">blank_fields</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;joinColumns&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;@JoinColumn(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"a_id</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;})<br />
对于B，映射为<br />
</span><span style="color: #000000;">@JoinTable(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">blank_fields</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;joinColumns&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;@JoinColumn(name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"b_id</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;})</span><br />
这样作的缺点是：带来了数据库冗余，对于<span style="color: #000000;">blank_fields来讲，任一条记录，a_id和b_id中只有一个不为null。当多个实体共用这个表时，用上面的方法更合理，如果共用实体不多时，这种方法更方便。</span></div>
<img src ="http://www.blogjava.net/honzeland/aggbug/318875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honzeland/" target="_blank">honzeland</a> 2010-04-20 17:20 <a href="http://www.blogjava.net/honzeland/archive/2010/04/20/318875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>One Hibernate Session Multiple Transactions</title><link>http://www.blogjava.net/honzeland/archive/2010/03/01/314150.html</link><dc:creator>honzeland</dc:creator><author>honzeland</author><pubDate>Mon, 01 Mar 2010 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/honzeland/archive/2010/03/01/314150.html</guid><wfw:comment>http://www.blogjava.net/honzeland/comments/314150.html</wfw:comment><comments>http://www.blogjava.net/honzeland/archive/2010/03/01/314150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honzeland/comments/commentRss/314150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honzeland/services/trackbacks/314150.html</trackback:ping><description><![CDATA[The case to use One Hibernate Session Multiple Transactions:<br />
each transaction would NOT affect others.<br />
i.e., open multiple transactions on the same session, even though one transaction rolls back, other transactions can be committed. If one action fails, others should fail too, then we should use one transaction for all actions.<br />
<br />
Note:<br />
A rollback with a single Session will lead to that Session being cleared (through "Session.clear()"). <br />
So do lazy collections still work if the session is cleared? =&gt;Not of any objects that you loaded up until the rollback. Only for new objects loaded afterwards. <br />
We should load necessary objects to session for each transactional action to avoid LazyInitializationException, even if those objects are loaded before other forward transactional actions, since forward action may be rolled back and clear the session.<br />
<br />
BTW, Hibernate Session.merge() is different with Session.update() by:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Item&nbsp;item2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.merge(item);<br />
item2&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;item;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;false,&nbsp;item&nbsp;-&nbsp;DETACHED,&nbsp;item2&nbsp;-&nbsp;PERSIST</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">session.update(item);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;no&nbsp;return&nbsp;value,&nbsp;make&nbsp;item&nbsp;PERSIST</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/honzeland/aggbug/314150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honzeland/" target="_blank">honzeland</a> 2010-03-01 11:47 <a href="http://www.blogjava.net/honzeland/archive/2010/03/01/314150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only</title><link>http://www.blogjava.net/honzeland/archive/2010/02/24/313829.html</link><dc:creator>honzeland</dc:creator><author>honzeland</author><pubDate>Wed, 24 Feb 2010 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/honzeland/archive/2010/02/24/313829.html</guid><wfw:comment>http://www.blogjava.net/honzeland/comments/313829.html</wfw:comment><comments>http://www.blogjava.net/honzeland/archive/2010/02/24/313829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honzeland/comments/commentRss/313829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honzeland/services/trackbacks/313829.html</trackback:ping><description><![CDATA[发生这种异常的case:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp; @Transactional<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;foo()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bar();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(RuntimeException&nbsp;re)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;caught&nbsp;but&nbsp;not&nbsp;throw&nbsp;further</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Transactional<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;bar()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
如果foo在调用bar的时候，bar抛出RuntimeException，Spring在bar return时将Transactional标记为Rollback only， 而foo捕获了bar的RuntimeException，所以Spring将会commit foo的事务，但是foo和bar使用的是同一事务，因此在commit foo事务时，将会抛出UnexpectedRollbackException。注意：如果foo和bar在同一class中，不会出现这种情况，因为：<br />
<br />
<span style="font-style: italic;">Since this mechanism is based on proxies, only 'external' method calls coming in through the proxy will be intercepted. This means that 'self-invocation', i.e. a method within the target object calling some other method of the target object, won't lead to an actual transaction at runtime even if the invoked method is marked with @Transactional!</span><br />
<br />
可以通过配置log4j来debug Spring事务获取情况：<br />
To delve more into it I would turn up your log4j logging to debug and also look at what ExerciseModuleController is doing at line 91, e.g.: add a logger for org.springframework.transaction<br />
<img src ="http://www.blogjava.net/honzeland/aggbug/313829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honzeland/" target="_blank">honzeland</a> 2010-02-24 18:02 <a href="http://www.blogjava.net/honzeland/archive/2010/02/24/313829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Discussion for Open Session In View Pattern for Hibernate</title><link>http://www.blogjava.net/honzeland/archive/2010/01/29/311244.html</link><dc:creator>honzeland</dc:creator><author>honzeland</author><pubDate>Fri, 29 Jan 2010 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/honzeland/archive/2010/01/29/311244.html</guid><wfw:comment>http://www.blogjava.net/honzeland/comments/311244.html</wfw:comment><comments>http://www.blogjava.net/honzeland/archive/2010/01/29/311244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honzeland/comments/commentRss/311244.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honzeland/services/trackbacks/311244.html</trackback:ping><description><![CDATA[From:
<a href="http://www.mail-archive.com/stripes-users@lists.sourceforge.net/msg02908.html">http://www.mail-archive.com/stripes-users@lists.sourceforge.net/msg02908.html</a><br />
<br />
<br />
<img src ="http://www.blogjava.net/honzeland/aggbug/311244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honzeland/" target="_blank">honzeland</a> 2010-01-29 17:20 <a href="http://www.blogjava.net/honzeland/archive/2010/01/29/311244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>