﻿<?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-日出而作兮勤于外，日落而归兮忙于内-随笔分类-j2ee</title><link>http://www.blogjava.net/cherishchen/category/23924.html</link><description>The art of living is to know when to hold fast and when to let go</description><language>zh-cn</language><lastBuildDate>Fri, 24 Aug 2007 22:34:37 GMT</lastBuildDate><pubDate>Fri, 24 Aug 2007 22:34:37 GMT</pubDate><ttl>60</ttl><item><title>也来写个struts2 CURD的例子-Move CRUD Operations into the same Action</title><link>http://www.blogjava.net/cherishchen/archive/2007/08/23/138760.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Thu, 23 Aug 2007 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/08/23/138760.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/138760.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/08/23/138760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/138760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/138760.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近读starting struts2 online，里面有一节Move CRUD Operations into the same Action，提供了Move CRUD Operations into the same Action大概的sample，于是进行了补充，记录下来，以备使用。 一、思路  在这本书里，lan roughley提到在结合preparable和ModenDriven拦截...&nbsp;&nbsp;<a href='http://www.blogjava.net/cherishchen/archive/2007/08/23/138760.html'>阅读全文</a><img src ="http://www.blogjava.net/cherishchen/aggbug/138760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-08-23 11:02 <a href="http://www.blogjava.net/cherishchen/archive/2007/08/23/138760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPA --Java EE 5.0 ORM 规范（转）</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Sat, 21 Jul 2007 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/131658.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/131658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/131658.html</trackback:ping><description><![CDATA[<p>作者: 它山 出处:<a href="http://www.it168.com/">IT168</a></p> <p><a title="http://tech.it168.com/j/n/2007-03-05/200703051354348.shtml" href="http://tech.it168.com/j/n/2007-03-05/200703051354348.shtml">http://tech.it168.com/j/n/2007-03-05/200703051354348.shtml</a></p> <p>PA作为一项对象持久化的标准，不但可以获得Java EE应用服务器的支持，还可以直接在Java SE中使用。</p> <p>介绍得很清楚的文章</p> <p>&nbsp;</p> <p><strong>JPA概述</strong>  <p>JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范，将得到所有Java EE服务器的支持。Sun这次吸取了之前EJB规范惨痛失败的经历，在充分吸收现有ORM框架的基础上，得到了一个易于使用、伸缩性强的ORM规范。从目前的开发社区的反应上看，JPA受到了极大的支持和赞扬，JPA作为ORM领域标准化整合者的目标应该不难实现。&nbsp;  <p>JPA通过JDK 5.0注解或XML描述对象－关系表的映射关系，并将运行期的实体对象持久化到数据库中，图 1很好地描述了JPA的结构：  <p><img height="305" alt="" src="http://developer.51cto.com/files/uploadimg/20070305/1547200.JPG" width="450">  <p>Sun引入新的JPA ORM规范出于两个原因：其一，简化现有Java EE和Java SE应用的对象持久化的开发工作；其二，Sun希望整合对ORM技术，实现天下归一。&nbsp;  <p>JPA由EJB 3.0软件专家组开发，作为JSR-220实现的一部分。但它不囿于EJB 3.0，你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范，由此可见，经过这几年的实践探索，能够脱离容器独立运行，方便开发和测试的理念已经深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现。  <p>JPA的总体思想和现有Hibernate、TopLink，JDO等ORM框架大体一致。总的来说，JPA包括以下3方面的技术：&nbsp;  <ul> <li>ORM映射元数据，JPA支持XML和JDK 5.0注解两种元数据的形式，元数据描述对象和表之间的映射关系，框架据此将实体对象持久化到数据库表中；&nbsp;  <li>JPA 的API，用来操作实体对象，执行CRUD操作，框架在后台替我们完成所有的事情，开发者从繁琐的JDBC和SQL代码中解脱出来。&nbsp;  <li>查询语言，这是持久化操作中很重要的一个方面，通过面向对象而非面向数据库的查询语言查询数据，避免程序的SQL语句紧密耦合。&nbsp;</li></ul><img src ="http://www.blogjava.net/cherishchen/aggbug/131658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-21 20:50 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPA：好与坏？常见问题解答</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/19/131257.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Thu, 19 Jul 2007 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/19/131257.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/131257.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/19/131257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/131257.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/131257.html</trackback:ping><description><![CDATA[<p><a href="http://www.matrix.org.cn/resource/article/2007-05-17/JPA_2d807795-03ff-11dc-b893-bfacd340f814.html" target="_blank">JPA：好与坏？常见问题解答</a></p> <p>&nbsp;</p> <p>问题：EJB专家团队是如何摆脱事务描述符的?<br>　　回答：在会话bean和消息驱动bean中，可以通过描述符和注释来控制事务的行为。此外，我们将默认的事务属性更改为“REQUIRED”，这个默认值比以前的值“SUPPORTS”更常用。因此，完全不必为业务方法配置事务行为。<br>　　JPA实体仅供本地使用，重点关注域模型。因此，无法在JPA实体上配置事务性(或远程边界或安全性)。而是必须使用会话bean façade(或消息驱动bean)，才可以通过EJB协议使用这些实体。通常来说，这是一件好事，配置安全性、远程处理和事务的粒度应该比持久化数据的粒度粗很多。JPA着重关注持久化数据，以及与EJB的其他部分和Java EE规范集成起来照管其他企业关注点。<br>　　问题：推荐对主键使用“long”还是“Long”?如果允许使用null作为值，将会如何?<br>　　回答：这实际上取决于您的数据模型。如果您的数据模型允许主键为null，那么使用Long，如果您的数据模型规定主键列不能为null，则使用 long更合适。总的来说，我认为对于非复合主键，允许null作为合法值容易产生混淆，因此我倾向于使用long，而不是Long。<br>　　问题：您说EJB 2.0不支持继承，但是可以在几个不同位置(远程/bean)使用继承，只是不在本地使用而已。请解释一下。<br>　　回答：根据EJB 2.1规范的附录D3：<br>　　当前的EJB规范未指定组件继承的概念。<br>　　另一方面，JPA规范确实规定了实体继承的概念。我们已经处理了EJB 2.1规范中指出的各种问题和复杂性，现在允许完全的多态查询和关联。<br>　　问题：BEA计划什么时候支持/发布EJB3?<br>　　WebLogic Server 10 Technology Preview 是完全符合规范的Java EE 5应用服务器。它包括完整的EJB3支持。WebLogic Server 10大概于三月下旬发布。<br>　　此外，Kodo 是完全符合规范的生产就绪JPA实现，并且已经发布。<br>　　问题：JPA是否支持组合主键?<br>　　回答：JPA支持自然ID和组合ID，以及数据库指派或实现指派的数字值。<br>　　问题：是否存在Spring模板，像JDBC模板一样可以在容器外部使用?<br>　　回答：是的，Spring 2有JPA模板。但是，Spring 2可以对任何标记着@Repository的bean执行JPA异常转译。因此，总的来说，对于新的应用程序，最好直接使用JPA API，而不是另一个模板层。对于使用模板和正在迁移到JPA的现有应用程序来说，使用模板方法比较合理。<br>　　此外，可以像在Java EE服务器中一样将JPA的持久化单元部署到Spring，Spring对JPA规范中指出的EntityManager注入和查找服从容器规则。<br>　　问题：JPA是否支持JDK1.4?<br>　　回答：JPA需要Java 5或更新版本。<br>问题：使用范围查询时，它是否也会返回结果总数(例如，返回538项结果中的1-10项)?<br>　　回答：不，要想获得总数，必须发出另外一个查询。通用模式是，在第一次执行搜索时获得总数，然后通过页面浏览结果，将总数存储到方便的位置(会话状态、cookie等)：<pre>　　if (isFirstPage()) { // this is the first time we're executing this query <br>　　Query q = em.createQuery("SELECT COUNT(p) FROM Product p WHERE ..."); <br>　　long count = ((Long) q.getSingleResult()).longValue(); <br>　　// store count somewhere stateful <br>　　} <br>　　Query q = em.createQuery("SELECT p FROM Product p WHERE ..."); <br>　　q.setFirstResult(page * PAGE_SIZE); // page is stored somewhere stateful <br>　　q.setMaxResults(PAGE_SIZE); </pre><br>　　问题：具有JPA包装器的Hibernate是不是一种EJB3实现?<br>　　回答：JPA规范是完整的EJB3规范的子集，因此JPA实现本身不是完整的EJB3实现。我不了解RedHat的EJB3实现的情况如何。但，Hibernate是JPA实现。<br>　　问题：与Hibernate相比，JPA是不是更好?<br>　　回答：JPA是规范，而Hibernate是实现。因此，这是不同事物的比较。可以肯定，使用标准API比使用专有API有更多优势，但不存在真正的劣势。<br>　　问题：是不是不再需要学习和使用Hibernate?<br>　　回答：规范团队关于JPA 1的目标之一是制定一个可以由很多供应商实现的API，并且开发人员可以编码来实现该API，而不是使用私有供应商特有的API。我们已成功实现这个目标，因此您只需使用供应商特有的API来获得JPA规范没有解决但您的应用程序中需要的功能。我的建议是尽可能地使用JPA API，但是当需要供应商公开但是规范中没有提供的功能时，则使用供应商特有的API。<br>　　例如，OpenJPA提供了保存点功能，但JPA规范没有。因此，希望使用保存点的OpenJPA开发人员应该对代码的大部分内容使用JPA规范，而借助OpenJPAEntityManager来设置和管理保存点。<br>　　问题：规范是否解决了缓存问题?<br>　　回答：JPA规范没有解决二级缓存问题(EntityManagerFactory-级)，但是提供了实现该缓存必须遵守的一些数据锁定和一致性规则，即使在启用缓存时也是如此。<br>　　有少量与缓存有关的主题可能会在将来的JPA规范版本中解决，但是大多数缓存主题不必指定规则，这样，不同的供应商就可以轻松地完成不同的工作。此处增加的最重要的内容是一些基本缓存控制API，如回收某些对象ID，或将一些经常访问的ID固定到缓存中。<br>　　问题：既然实体管理器承担了所有繁重的工作负载，那么会话bean还有什么价值?<br>　　回答：EntityManager负责域对象模型和数据库之间的交互，但是仍然在会话中实现安全性、事务控制、远程处理、有状态的临时数据存储，而操作单元编程模型无法解决以上问题。会话bean还是部署单元和公用服务边界。因此，会话bean是定义所有业务代码的地方。换而言之，会话bean是EJB 容器关注的，而JPA实现是在会话bean中使用的。<br>　　当然，您还可以直接从servlet或JSP或其他任何可以使用Java 5的地方使用JPA。但是这样的话，您就必须管理自己的事务、处理自己的集群服务故障转移、管理自己的服务重部署等。<br>问题：相对于EJB2来说，EJB3可以处理多少个并发事务?<br>　　回答：从纯会话bean的观点来讲，至少在WebLogic Server中，并发事务的数目没有什么差别。也就是，如果将您的应用程序从EJB2会话bean转换到EJB3会话bean，但是完全没有修改持久化机制，可能不会发现重大差别。这是因为EJB3规范对会话bean部分的大多数更改着重实现编程模型的改进。<br>　　从实体bean的观点来讲，我认为对于大多数应用程序，WebLogic Server的EJB 2.1和JPA支持的并发事务数目相同。您可能发现JPA对于非主键的查询来说，可伸缩性更高。一旦开始钻研Kodo的 锁定组之类的功能，则对于固定的域模型，可以从基于JPA的系统中获得更多并发事务。<br>　　问题：如何为AquaLogic DSP应用JPA?<br>　　回答：AquaLogic DSP着重关注对数据的多重存储访问，并将数据作为数据服务提供，通常作为XML或SDO呈现这些数据。JPA规范着重关注与数据存储交互的Java API。可以设想，JPA绑定到AquaLogic DSP，或SDO绑定到Kodo产品(BEA的JPA实现)。<br>　　问题：JPA是否支持惰性加载?<br>　　回答：是的。默认情况下，Collection和Map类型的字段是惰性检索的，而其他所有字段都是主动获取的。通过在字段的持久化注解中指明“fetch”属性，可以基于各个字段静态地控制该行为。<br>　　问题：什么是实现过程的最佳位置，例如，检查许多用户及其帐户(在银行应用程序中)以付给利息?是在数据库的存储过程中实现，还是在EJB中使用JPA实现，还是同时使用这两种方式?<br>　　回答：根据我的经验，这实际上取决于组织因素，而不是其他因素。一些工作室更喜欢在存储过程中进行大量编码，而另一些则喜欢在Java中实现其业务逻辑。每种方法各有优势和代价。<br>　　尽管如此，还是有一些问题可促使他们优先考虑其中的一种环境。在您的例子中，在数据库中执行大量计算可能比将数据加载到内存中更快，因此使用存储过程可能比较合理。另一方面，数据库承担这么多负载将对该应用程序的用户产生负面影响，因此最好付出一定代价跨网络拉出这些数据，以便将该数据库用作严格的存储系统，而不是计算引擎。或者，如果应用程序的其余部分主要使用JPA，则适用的话，可能希望使用JPQL的大批量更新功能来进行更新。<br>　　问题：如果不先将数据加载到内存中，是否可以执行大批量更新?<br>　　回答：是的，可以通过JPQL执行大批量更新和大批量删除：<br>　　UPDATE Employee e SET e.salary = e.salary * 1.1 WHERE e.salary &lt; 100000 <br>　　问题：你们对Kodo JDO有什么规划?JPA是否会通过实现JDO的所有功能而将其取代?如果是的话，是否存在任何时间表?如果不是，你们会不会继续积极地开发JDO?<br>　　回答：BEA仍然完全忠于JDO。从规范的观点来看，我认为过一段时间之后，JPA将包含当前的JDO规范中越来越多的功能。但是，我不了解Sun对JDO和JPA之间的融合工作有什么规划。<br>问题：什么是持久化单元?<br>　　回答：持久化单元是类和配置设置的集合，可以根据该集合创建EntityManagerFactory。它在 persistence.xml 文件中作为一个条目出现。<br>　　问题：如何在WebLogic 9.2中测试JPA<br>　　回答：现在可以在WebLogic 9.2中使用OpenJPA或Kodo。该服务器不执行会话bean持久化单元注入，但是在10.0服务器中可以这么作，并且在9.2中，没有任何 Kodo控制台集成。但是除了引导注入问题之外，应该能够在WebLogic 9.2中成功地使用JPA，包括参与托管事务。<br>　　问题：JDBC连接对应于JPA中的什么概念?<br>　　回答：JPA EntityManager大致相当于JDBC连接，而JPA EntityManagerFactory从概念上类似于JDBC数据源。JPA EntityTransaction(仅在JTA / appserver上下文以外可用)相当于JDBC连接的事务控制API。<br>　　在OpenJPA中，EntityManager在其生命周期中可能使用多个不同的JDBC连接。请参阅 openjpa.ConnectionRetainMode 属性的文档了解详细信息。<br>　　问题：关于fetch类型，如果默认是主动(eager)加载，则提供程序可能忽略惰性(lazy)加载指令。因此，即使将字段设置为惰性，也可能会加载不必要的数据。将来的规范会不会将其修改为必须与fecth类型一致?这会涉及到什么问题?<br>　　回答：通常，OpenJPA永远不会忽略用户配置的FetchMode。这是提示而不是规则，因为惰性加载实际上是调优过程中一项关注事项，永远都不应该对应用程序产生行为性的影响*。JPA规范力图避免要求使用任何明确的性能调优策略，因为不同的网络拓扑结构、数据存储系统和应用程序行为需要不同的调优关注。<br>　　例如，OpenJPA允许在运行时 动态控制 fetch配置。这意味着，它可能静态地配置对象模型，使某些字段进行惰性加载，然后动态地将其中一个字段添加到当前的fetch计划。这将导致OpenJPA违反静态定义的惰性设置。<br>　　在当天结束时，如果实现对数据加载执行错误的操作，您应能够非常轻松地评估其他实现，通过威胁转移到另一个实现，以至少获得所需的功能。这是让大量供应商采用JPA规范的重大优势之一。<br>　　*当然，如果您依靠惰性加载设置来防止加载某些数据，以免后来传输到不同的层(也就是为了数据安全性)，那么惰性加载存在重要的行为性影响。在OpenJPA中，可以使用 fetch组 控制通过电缆发送数据图时确切地分离哪些数据。<br>　　问题：在运行时更改fetch模式容不容易?<br>　　回答：JPA规范没有为此提供任何工具。OpenJPA通过 fetch规划 接口提供了对fetch特征的详细控制。JPQL的“JOIN FETCH”结构也可以用于限制主动fetch提示。<br>　　问题：使用乐观锁定时，@Version注释仅支持int字段吗，它可以是datetime吗?<br>　　回答：根据JPA的要求，@Version可以对int、long、short、Integer、Short、Long和Timestamp类型的字段使用。(JPA规范的第9.1.17小节)。<br>　　问题：在JPA可以调用存储过程吗?<br>　　回答：JPA规范仅要求支持SELECT SQL语句(通过EntityManager.createNativeQuery()调用，或@NamedNativeQuery注解或named- native-query XML元素)。但是，我认为大多数实现也多少支持以相同方式调用存储过程。<br>问题：在EJB3中，更新实体bean的单个字段/列会导致更新该DB行中的所有字段/列，还是仅更新该DB行中更改的列?<br>　　回答：该行为取决于实现。OpenJPA将只更新被修改字段对应的列。但是，我们可能在某些位置添加update-all-columns选项。请参阅 OPENJPA-38。<br>　　问题：EJB3.0如何替换EJB2.0中的ejbLoad()、ejbStore()之类的回调方法?<br>　　回答：JPA规范提供了一些可以随意(单个)实现的 回调方法。<br>　　问题：EJB3.0如何替换EJB2.0 CMP和BMP?<br>　　回答：EJB3 JPA规范对EJB2 CMP提供了功能完善的替换。JPA规范没有解决bean管理的持久化，如果您希望实现自己的持久化，应该继续使用BMP，或者最好使用会话bean façade进行自定义持久化。<br>　　问题：命名查询可以位于JPA实体以外吗?就像在会话bean或帮助类中那样?<br>　　回答：JPA实现仅扫描实体类(和映射超类以及嵌入类)来查找命名查询。我希望将来的JPA规范版本提供一种方式，用于将命名查询限制到一个类对象中，到那个时候，就可以认为能够在任何位置定义命名查询。<br>　　可以在orm.xml文件中定义命名查询，然后使您的持久化单元指向该orm.xml文件，JPA规范允许将任意数目的orm.xml文件合并到一起。<br>　　问题：JPQL支持多数据库查询吗?<br>　　回答：JPA规范并不要求实现必须只使用单个数据库(甚至实现必须使用关系数据库)。因此实现可以随意提供对多个数据库的访问。但是，据我所知，当前的JPA实现都没有这么作，除非是通过数据库方的工作来实现多数据库查询。<br>　　问题：在JPQL中，SELECT子句可以从多个实体中拉出数据吗?<br>　　回答：是的。JPQL语言允许查询聚合和投影。因此以下语句是有效的JPQL语句：<br>　　select p.name, p.contactInfo.phoneNumber from Person p <br>　　select p.address.state, avg(p.salary) from Person p group by p.address.state <br>　　问题：JPA规范是否解决了缓存问题?<br>　　回答：JPA规范仅解决给定EntityManager相关对象的事务工作集的行为。它称之为“持久化上下文”。从某些方面来讲，这是一个缓存，但通常是为了保持事务一致性，而不是为了性能的原因。<br>　　JPA规范没有解决性能缓存，如OpenJPA的 数据缓存 和 查询缓存。但是规范中的规则对这类性能缓存暗示了某些行为约束。<br>　　总而言之，JPA规范主要关注的仅是API的行为方面，而由各种实现完成大多数性能有关的调优。尽管如此，所有可靠的实现都应该拥有某种数据缓存，以作为选择。<br>　　问题：WebLogic Server 9.0仍然仅支持EJB2.0，是吗?<br>　　回答：正确。WebLogic Server 10.0是完全支持EJB3规范的第一款BEA产品。在WebLogic Server 9中可以通过BEA Kodo产品来使用JPA。<br>问题：关于JPA的推荐教程是什么?<br>　　回答：Kodo文档 中提供了许多JPA教程。<br>　　问题：是否存在任何方式，用于跨所有实体表配置表前缀?<br>　　回答：JPA规范中没有提供这种方式，在OpenJPA中，可以通过创建扩展的 DBDictionary 并重写getValidTableName()方法来实现该功能。<br>　　问题：是否可能通过编程修改ORM绑定(如重写orm.xml中指定的一些ORM配置)?<br>　　回答：不是通过JPA规范实现的。OpenJPA提供了一些方法，用于以编程的方式创建映射信息，并且该规范确实提供了一种方法，用于在创建EntityManager时，将特定于供应商的重写内容传递给persistence.xml中的数据。<br>　　问题：我们正在构建一个大型应用程序，其中有350个对象坚持JPA规范。当我们使用Kodo 4.1持久化这些对象时，它的SELECT查询最终将每个查询的大多数表连接起来，这使得Kodo相当慢。TopLink Essentials实现仅连接少量的相关表。您对解决该问题有什么建议?<br>　　回答：我认为这与“一对一”和“多对一”字段类型的不同默认行为有关。我猜想，如果您明确地告知Kodo对“一对一”和“多对一”字段类型执行惰性加载，就会很清楚。如果这不起作用，或者如果您希望获得更多帮助来分析您的具体用例，请发送电子邮件到plinskey@bea.com。<br>　　问题：开发人员可以使用JPA来控制表的连接方式吗?<br>　　回答：不能直接控制，并且不是通过规范实现的。但是，大多数实现可能提供了一些方式来影响如何连接。有关OpenJPA的详细信息，请参阅关于 主动fetching 的文档。<br>　　问题：在何处指定数据源?<br>　　回答：数据源通常是在persistence.xml中指定的，根据您的实现和应用服务器的默认行为，可能需要为jta-data-source和/或non-jta-data-source设置提供值。<br>　　问题：JPA规范是否计划在将来支持里程碑或双时态链(bi-temporal)?<br>　　回答：据我所知，JPA规范团队目前没有计划提供任何时态功能。<br>　　问题：如果抛出乐观锁定异常，可以了解哪些列发生冲突吗<br>　　回答：不可以。您可以了解哪些实例失败，但不是字段。给定失败的实例，很容易从数据库中加载新值，并进行比较。<img src ="http://www.blogjava.net/cherishchen/aggbug/131257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-19 14:14 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/19/131257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2EE的Blog平台(转)</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/16/130475.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 16 Jul 2007 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/16/130475.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/130475.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/16/130475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/130475.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/130475.html</trackback:ping><description><![CDATA[<p><a title="http://www.javaeedev.com/blog/article.jspx?articleId=ff80808112e766ee01130e1db01c0018" href="http://www.javaeedev.com/blog/article.jspx?articleId=ff80808112e766ee01130e1db01c0018">http://www.javaeedev.com/blog/article.jspx?articleId=ff80808112e766ee01130e1db01c0018</a></p> <p>很清楚，还有源码下载</p><img src ="http://www.blogjava.net/cherishchen/aggbug/130475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-16 09:22 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/16/130475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring事务、异常</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/04/128018.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Wed, 04 Jul 2007 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/04/128018.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/128018.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/04/128018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/128018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/128018.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">Spring</span><span style="font-family: 宋体;">的事务实现采用基于</span><span lang="EN-US">AOP</span><span style="font-family: 宋体;">的拦截器来实现，如果没有在事务配置的时候注明回滚的</span><span lang="EN-US">checked
exception</span><span style="font-family: 宋体;">，那么只有在发生了</span><span lang="EN-US">unchecked
exception</span><span style="font-family: 宋体;">的时候，才会进行事务回滚。因此在</span><span lang="EN-US">DAO</span><span style="font-family: 宋体;">层和</span><span lang="EN-US">service</span><span style="font-family: 宋体;">层，最好抛出</span><span lang="EN-US">unckecked exception</span><span style="font-family: 宋体;">，毕竟对于数据库操作，使用</span><span lang="EN-US">unckecked exception</span><span style="font-family: 宋体;">更加合适，这个方面的例子</span><span lang="EN-US">hibernate</span><span style="font-family: 宋体;">就是一个，在</span><span lang="EN-US">hibernate2</span><span style="font-family: 宋体;">中，</span><span lang="EN-US">HibernateException</span><span style="font-family: 宋体;">还是</span><span lang="EN-US">checked exceptions</span><span style="font-family: 宋体;">，但是到了</span><span lang="EN-US">hibernate3</span><span style="font-family: 宋体;">中就成了</span><span lang="EN-US">unchecked exceptions</span><span style="font-family: 宋体;">，因为对于数据库操作来说，一旦出现异常，就是比较严重的错误，而且在</span><span lang="EN-US">client</span><span style="font-family: 宋体;">端基本上是无能为力的，所以使用</span><span lang="EN-US">unchecked exceptions</span><span style="font-family: 宋体;">更加合适。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">另外，在</span><span lang="EN-US">DAO</span><span style="font-family: 宋体;">和</span><span lang="EN-US">service</span><span style="font-family: 宋体;">层的代码中，除非是为了异常的转化、重新抛出，否则不要捕捉和处理异常，否则</span><span lang="EN-US">AOP</span><span style="font-family: 宋体;">在拦截的时候就不能捕捉到异常，也就不能正确执行回滚。这一点通常很容易被忽视，只有在明白了</span><span lang="EN-US">spring</span><span style="font-family: 宋体;">的事务处理机制后，才能领会到。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">对于</span><span lang="EN-US">hibernate</span><span style="font-family: 宋体;">的异常，</span><span lang="EN-US">spring</span><span style="font-family: 宋体;">会包装</span><span lang="EN-US">hibernate</span><span style="font-family: 宋体;">的</span><span lang="EN-US">upckecked hibernateException</span><span style="font-family: 宋体;">到</span><span lang="EN-US">DAOAccessException</span><span style="font-family: 宋体;">，并且抛出，在事务管理层，一旦接收到</span><span lang="EN-US">DAOAccessException</span><span style="font-family: 宋体;">就会触发事务的回滚，同时该异常会继续向上层抛出，供上层进一步处理，比如在</span><span lang="EN-US">UI</span><span style="font-family: 宋体;">层向用户反馈错误信息等。</span></p>
<span style="font-size: 10.5pt; font-family: 宋体;">下面的来自</span><span style="font-size: 10.5pt; font-family: &quot;times new roman&quot;;" lang="EN-US">spring</span><span style="font-size: 10.5pt; font-family: 宋体;">参考手册的例子说明了</span><span style="font-size: 10.5pt; font-family: &quot;times new roman&quot;;" lang="EN-US">spring</span><span style="font-size: 10.5pt; font-family: 宋体;">的事务和异常的关系，为了更好地说明问题，我修改了部分代码：<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: #0000ff;">package</span><span style="color: #000000;">&nbsp;x.y.service;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.dao.DataAccessException;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.dao.PermissionDeniedDataAccessException;<br><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;DefaultFooService&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;FooService&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName,&nbsp;String&nbsp;barName)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><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;insertFoo(Foo&nbsp;foo)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;DataAccessException&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PermissionDeniedDataAccessException(</span><span style="color: #000000;">"</span><span style="color: #000000;">执行事务操作时发生异常</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException());<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><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;updateFoo(Foo&nbsp;foo)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
<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: #0000ff;">package</span><span style="color: #000000;">&nbsp;x.y.service;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.context.ApplicationContext;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.dao.DataAccessException;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Boot&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;ctx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ClassPathXmlApplicationContext(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">,Boot.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FooService&nbsp;fooService&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(FooService)&nbsp;ctx.getBean(</span><span style="color: #000000;">"</span><span style="color: #000000;">fooService</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fooService.insertFoo(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Foo());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(DataAccessException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">事务操作出现异常</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
</span>
<p class="MsoNormal"><span style="font-family: 宋体;">这里，当</span><span lang="EN-US">Boot</span><span style="font-family: 宋体;">对象调用</span><span lang="EN-US">FooService</span><span style="font-family: 宋体;">来进行事务操作时，由于在事务操作时抛出了</span><span lang="EN-US">unchecked
exception</span><span style="font-family: 宋体;">，被</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">的</span><span lang="EN-US">AOP</span><span style="font-family: 宋体;">事务处理模块拦截，触发了事务的回滚，同时最终在控制台上打出了&#8220;事务操作出现异常&#8221;，说明</span><span lang="EN-US">spring</span><span style="font-family: 宋体;">在触发了数据库回滚的同时又重新抛出了该异常。</span><span lang="EN-US"><o:p> <br></o:p></span></p>
<span style="font-size: 10.5pt; font-family: 宋体;">为了更好地看到</span><span style="font-size: 10.5pt; font-family: &quot;times new roman&quot;;" lang="EN-US">spring</span><span style="font-size: 10.5pt; font-family: 宋体;">事务拦截的过程，建议将日志模式调至</span><span style="font-size: 10.5pt; font-family: &quot;times new roman&quot;;" lang="EN-US">debug</span><span style="font-size: 10.5pt; font-family: 宋体;">模式<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: #0000ff;">package</span><span style="color: #000000;">&nbsp;x.y.service;<br><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;Foo&nbsp;{<br>}<br></span></div>
<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: #0000ff;">package</span><span style="color: #000000;">&nbsp;x.y.service;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.dao.DataAccessException;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;FooService&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName,&nbsp;String&nbsp;barName);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;insertFoo(Foo&nbsp;foo)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;DataAccessException;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;updateFoo(Foo&nbsp;foo)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;DataAccessException;<br>}<br></span></div>
<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: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">beans&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:aop</span><span style="color: #0000ff;">="http://www.springframework.org/schema/aop"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx</span><span style="color: #0000ff;">="http://www.springframework.org/schema/tx"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff;">="<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/tx&nbsp;http://www.springframework.org/schema/tx/spring-tx-2.0.xsd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop&nbsp;http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;this&nbsp;is&nbsp;the&nbsp;service&nbsp;object&nbsp;that&nbsp;we&nbsp;want&nbsp;to&nbsp;make&nbsp;transactional&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="fooService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="x.y.service.DefaultFooService"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;the&nbsp;transactional&nbsp;advice&nbsp;(i.e.&nbsp;what&nbsp;'happens';&nbsp;see&nbsp;the&nbsp;&lt;aop:advisor/&gt;&nbsp;bean&nbsp;below)&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:advice&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;">&nbsp;transaction-manager</span><span style="color: #0000ff;">="txManager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;the&nbsp;transactional&nbsp;semantics<img src="http://www.blogjava.net/Images/dot.gif">&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:attributes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;all&nbsp;methods&nbsp;starting&nbsp;with&nbsp;'get'&nbsp;are&nbsp;read-only&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="get*"</span><span style="color: #ff0000;">&nbsp;read-only</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;other&nbsp;methods&nbsp;use&nbsp;the&nbsp;default&nbsp;transaction&nbsp;settings&nbsp;(see&nbsp;below)&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="*"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tx:attributes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tx:advice</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;ensure&nbsp;that&nbsp;the&nbsp;above&nbsp;transactional&nbsp;advice&nbsp;runs&nbsp;for&nbsp;any&nbsp;execution<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;an&nbsp;operation&nbsp;defined&nbsp;by&nbsp;the&nbsp;FooService&nbsp;interface&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:pointcut&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="fooServiceOperation"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression</span><span style="color: #0000ff;">="execution(*&nbsp;x.y.service.FooService.*(..))"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:advisor&nbsp;</span><span style="color: #ff0000;">advice-ref</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointcut-ref</span><span style="color: #0000ff;">="fooServiceOperation"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">aop:config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;don't&nbsp;forget&nbsp;the&nbsp;DataSource&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="org.apache.commons.dbcp.BasicDataSource"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destroy-method</span><span style="color: #0000ff;">="close"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="driverClassName"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="org.h2.Driver"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="url"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="jdbc:h2:tcp://localhost/D:/try/data/sample;IFEXISTS=TRUE"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="username"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="sa"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="password"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="123456"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;similarly,&nbsp;don't&nbsp;forget&nbsp;the&nbsp;PlatformTransactionManager&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="txManager"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;other&nbsp;&lt;bean/&gt;&nbsp;definitions&nbsp;here&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span></div>
<br></span>
<h2><span style="font-size: 10.5pt; font-family: 宋体;">结论</span></h2>
在spring的事务管理环境下，使用unckecked exception可以极大地简化异常的处理，只需要在事务层声明可能抛出的异常（这里的异常可以是自定义的unckecked exception体系），在所有的中间层都只是需要简单throws即可，不需要捕捉和处理，直接到最高层，比如UI层再进行异常的捕捉和处理<br><br>
<h2><span style="font-size: 10.5pt; font-family: 宋体;"></span></h2>
<span style="font-size: 10.5pt; font-family: 宋体;"><br></span>  <img src ="http://www.blogjava.net/cherishchen/aggbug/128018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-04 09:30 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/04/128018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring学习日志-事务管理</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/03/127860.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Tue, 03 Jul 2007 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/03/127860.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/127860.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/03/127860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/127860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/127860.html</trackback:ping><description><![CDATA[<h1 style="color: #020000;">在service层控制事务<br></h1>
<p style="color: #020000;" class="MsoNormal">Spring<span style="font-family: 宋体;">推荐事务的控制在</span>service<span style="font-family: 宋体;">层实现，而不是像单独使用</span>hibernate<span style="font-family: 宋体;">那样，在</span>dao<span style="font-family: 宋体;">层实现，这样的好处在于更好地支持</span>declear<span style="font-family: 宋体;">方式的事务（</span>service<span style="font-family: 宋体;">层通常提供接口，这样可以针对接口来定义事务策略，而不是针对具体的</span>service<span style="font-family: 宋体;">实现，因此可以很方便地替换service的实现，而不需要修改事务的配置），更加灵活。同时，可以更加方面自然地实现全局事务的控制。</span></p>
<p class="MsoNormal">举例如下：</p>
service接口<br>
<p class="MsoNormal"></p>
<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: #0000ff;">package</span><span style="color: #000000;">&nbsp;x.y.service;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;FooService&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName,&nbsp;String&nbsp;barName);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;insertFoo(Foo&nbsp;foo);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;updateFoo(Foo&nbsp;foo);<br>}<br></span></div>
<p>&nbsp;</p>
<p class="MsoNormal"><br></p>
一个service实现<br>
<p class="MsoNormal">
</p>
<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: #0000ff;">package</span><span style="color: #000000;">&nbsp;x.y.service;<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;DefaultFooService&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;FooService&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName,&nbsp;String&nbsp;barName)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><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;insertFoo(Foo&nbsp;foo)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><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;updateFoo(Foo&nbsp;foo)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
<p>&nbsp;</p>
spring.xml，注意在声明事务的时候，是针对service接口的，而不是针对service实现的<br>
<p class="MsoNormal">
</p>
<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: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">beans&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:aop</span><span style="color: #0000ff;">="http://www.springframework.org/schema/aop"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx</span><span style="color: #0000ff;">="http://www.springframework.org/schema/tx"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff;">="<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/tx&nbsp;http://www.springframework.org/schema/tx/spring-tx-2.0.xsd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop&nbsp;http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;this&nbsp;is&nbsp;the&nbsp;service&nbsp;object&nbsp;that&nbsp;we&nbsp;want&nbsp;to&nbsp;make&nbsp;transactional&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="fooService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="x.y.service.DefaultFooService"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;the&nbsp;transactional&nbsp;advice&nbsp;(i.e.&nbsp;what&nbsp;'happens';&nbsp;see&nbsp;the&nbsp;&lt;aop:advisor/&gt;&nbsp;bean&nbsp;below)&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:advice&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;">&nbsp;transaction-manager</span><span style="color: #0000ff;">="txManager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;the&nbsp;transactional&nbsp;semantics<img src="http://www.blogjava.net/Images/dot.gif">&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:attributes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;all&nbsp;methods&nbsp;starting&nbsp;with&nbsp;'get'&nbsp;are&nbsp;read-only&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="get*"</span><span style="color: #ff0000;">&nbsp;read-only</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;other&nbsp;methods&nbsp;use&nbsp;the&nbsp;default&nbsp;transaction&nbsp;settings&nbsp;(see&nbsp;below)&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="*"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tx:attributes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tx:advice</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;ensure&nbsp;that&nbsp;the&nbsp;above&nbsp;transactional&nbsp;advice&nbsp;runs&nbsp;for&nbsp;any&nbsp;execution<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;an&nbsp;operation&nbsp;defined&nbsp;by&nbsp;the&nbsp;FooService&nbsp;interface&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:pointcut&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="fooServiceOperation"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression</span><span style="color: #0000ff;">="execution(*&nbsp;x.y.service.FooService.*(..))"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:advisor&nbsp;</span><span style="color: #ff0000;">advice-ref</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointcut-ref</span><span style="color: #0000ff;">="fooServiceOperation"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">aop:config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;don't&nbsp;forget&nbsp;the&nbsp;DataSource&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="org.apache.commons.dbcp.BasicDataSource"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destroy-method</span><span style="color: #0000ff;">="close"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="driverClassName"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="org.h2.Driver"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="url"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="jdbc:h2:tcp://localhost/D:/try/data/sample;IFEXISTS=TRUE"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="username"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="sa"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="password"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="123456"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;similarly,&nbsp;don't&nbsp;forget&nbsp;the&nbsp;PlatformTransactionManager&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="txManager"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;other&nbsp;&lt;bean/&gt;&nbsp;definitions&nbsp;here&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span></div>
<p>&nbsp;</p>
<h1 style="color: #020000;">使用service层方便了使用全局事务</h1>
<p class="MsoNormal"><span style="font-family: 宋体;">对于横跨多个</span><span lang="EN-US">Hibernate SessionFacotry</span><span style="font-family: 宋体;">的分布式事务，只需简单地将</span><span lang="EN-US"> JtaTransactionManager </span><span style="font-family: 宋体;">同多个</span><span lang="EN-US"> LocalSessionFactoryBean </span><span style="font-family: 宋体;">的定义结合起来作为事务策略。你的每一个</span><span lang="EN-US">DAO</span><span style="font-family: 宋体;">通过</span><span lang="EN-US">bean</span><span style="font-family: 宋体;">属性得到各自的</span><span lang="EN-US"> SessionFactory </span><span style="font-family: 宋体;">引用。在需要进行跨