﻿<?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: 宋体;">引用。在需要进行跨多个数据库的事务操作时，只需要定义一个</span><span lang="EN-US">service</span><span style="font-family: 宋体;">层，使用</span><span lang="EN-US"> JtaTransactionManager </span><span style="font-family: 宋体;">作为事务策略，横跨多个</span><span lang="EN-US">DAO</span><span style="font-family: 宋体;">和多个</span><span lang="EN-US">session
factories</span><span style="font-family: 宋体;">来划分事务，而不需要特殊的处理。</span><span lang="EN-US"><o:p></o:p></span></p>
示例的配置文件如下：<br><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: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&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;">="mySessionFactory1"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</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;">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;">="myDataSource1"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;..<br>&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;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="mySessionFactory2"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</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;">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;">="myDataSource2"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&#8230;<br>&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;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="myTxManager"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.transaction.jta.JtaTransactionManager"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&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;">="myProductDao"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="product.ProductDaoImpl"</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;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sessionFactory"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="mySessionFactory1"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&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;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="myInventoryDao"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="product.InventoryDaoImpl"</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;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sessionFactory"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="mySessionFactory2"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&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></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;</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;">="productServiceMethods"</span><span style="color: #ff0000;">&nbsp;expression</span><span style="color: #0000ff;">="execution(*&nbsp;product.ProductService.*(..))"</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:advisor&nbsp;</span><span style="color: #ff0000;">advice-ref</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;">&nbsp;pointcut-ref</span><span style="color: #0000ff;">="productServiceMethods"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&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;</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;">="myTxManager"</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:attributes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&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;">="increasePrice*"</span><span style="color: #ff0000;">&nbsp;propagation</span><span style="color: #0000ff;">="REQUIRED"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&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;">="someOtherBusinessMethod"</span><span style="color: #ff0000;">&nbsp;propagation</span><span style="color: #0000ff;">="REQUIRES_NEW"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&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;propagation</span><span style="color: #0000ff;">="SUPPORTS"</span><span style="color: #ff0000;">&nbsp;read-only</span><span style="color: #0000ff;">="true"</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:attributes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&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: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="product.ProductServiceImpl"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&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;">="productDao"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="myProductDao"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&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;">="inventoryDao"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="myInventoryDao"</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: #0000ff;">&lt;/</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span></div>
<br>
<p class="MsoNormal"><br></p>
<p class="MsoNormal"><br></p>
<p class="MsoNormal"><br><span style="font-family: 宋体; color: red;"></span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p><img src ="http://www.blogjava.net/cherishchen/aggbug/127860.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-03 15:26 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/03/127860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javaeye：讨论：关于利用spring截获异常 然后throw自己的Exceptions</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/01/127369.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Sun, 01 Jul 2007 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/01/127369.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/127369.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/01/127369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/127369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/127369.html</trackback:ping><description><![CDATA[http://www.javaeye.com/topic/13218?page=2<br><br>http://www.javaeye.com/topic/18152?page=1<br><br>http://www.javaeye.com/topic/41820<br><br><br> <img src ="http://www.blogjava.net/cherishchen/aggbug/127369.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-01 17:00 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/01/127369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小巧好用的H2数据库</title><link>http://www.blogjava.net/cherishchen/archive/2007/06/27/126524.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Wed, 27 Jun 2007 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/06/27/126524.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/126524.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/06/27/126524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/126524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/126524.html</trackback:ping><description><![CDATA[<p><a title="http://www.h2database.com/html/frame.html" href="http://www.h2database.com/html/frame.html">http://www.h2database.com/html/frame.html</a></p>
<p>&nbsp;</p>
<p>最近一个桌面的程序需要使用嵌入式数据库，选择了很多不同的嵌入式数据,最终选择了H2，性能是一个很重要的原因，下图是h2提供的Performance的比较图</p>
<p><a title="http://www.h2database.com/html/images/performance.png" href="http://www.h2database.com/html/images/performance.png">http://www.h2database.com/html/images/performance.png</a></p>
<p>&nbsp;</p>
<p>h2是Thomas Mueller提供的一个开源的、纯java实现的关系数据库，在google上面有讨论组<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#104;&#50;&#45;&#100;&#97;&#116;&#97;&#98;&#97;&#115;&#101;&#64;&#103;&#111;&#111;&#103;&#108;&#101;&#103;&#114;&#111;&#117;&#112;&#115;&#46;&#99;&#111;&#109;">h2-database@googlegroups.com</a>，Thomas Mueller也非常热情，回答问题非常及时。</p>
<p>&nbsp;</p>
<p>下面说下我最终选择h2的原因：</p>
<p>（1）性能、小巧</p>
<p>（2）同时支持网络版和嵌入式版本，另外还提供了内存版</p>
<p>（3）有比较好的兼容性，支持相当标准的sql标准（实际上也不存在一个数据库能够100%符合标准）</p>
<p>（4）提供了非常友好的基于web的数据库管理界面</p>
<p>（5）支持hibernate</p>
<br>
<p><br></p>
补充：<br>支持的事务隔离级别：<br><br>
<h2>Transaction <span id="firstFound" style="color: #000000; background-color: #ffff00;">Isolation</span></h2>
<p>
This database supports the following transaction <span id="firstFound" style="color: #000000; background-color: #ffff00;">isolation</span> <span style="color: #000000; background-color: #00ffff;">level</span>s:
</p>
<ul>
    <li><strong>Serializable</strong><br>
    This is the default <span style="color: #000000; background-color: #00ffff;">level</span>.<br>
    To enable, execute the SQL statement    'SET LOCK_MODE 0'<br>
    or append ;LOCK_MODE=1 to the database URL: jdbc:h2:~/test;LOCK_MODE=1
    </li>
    <li><strong>Read Committed</strong><br>
    Read locks are released immediately.
    Higher concurrency is possible when using this <span style="color: #000000; background-color: #00ffff;">level</span>.<br>
    This is the <span id="firstFound" style="color: #000000; background-color: #ffff00;">isolation</span> <span style="color: #000000; background-color: #00ffff;">level</span> used for many database systems.<br>
    To enable, execute the SQL statement    'SET LOCK_MODE 0'<br>
    or append ;LOCK_MODE=3 to the database URL: jdbc:h2:~/test;LOCK_MODE=3
    </li>
    <li><strong>Read Uncommitted</strong><br>
    This <span style="color: #000000; background-color: #00ffff;">level</span> means that transaction <span id="firstFound" style="color: #000000; background-color: #ffff00;">isolation</span> is disabled.<br>
    To enable, execute the SQL statement    'SET LOCK_MODE 0'<br>
    or append ;LOCK_MODE=0 to the database URL: jdbc:h2:~/test;LOCK_MODE=0
    </li>
</ul>
<p>
When using the <span id="firstFound" style="color: #000000; background-color: #ffff00;">isolation</span> <span style="color: #000000; background-color: #00ffff;">level</span> 'serializable', dirty reads, non-repeatable reads, and phantom reads are prohibited.
</p>
<ul>
    <li><strong>Dirty Reads</strong><br>
    Means a connection can read uncommitted changes made by another connection.<br>
    Possible with: read uncommitted
    </li>
    <li><strong>Non-Repeatable Reads</strong><br>
    A connection reads a row, another connection changes a row and commits,
    and the first connection re-reads the same row and gets the new result.<br>
    Possible with: read uncommitted, read committed
    </li>
    <li><strong>Phantom Reads</strong><br>
    A connection reads a set of rows using a condition, another connection
    inserts a row that falls in this condition and commits, then the first connection
    re-reads using the same condition and gets the new row.<br>
    Possible with: read uncommitted, read committed
    </li>
</ul>
<h3>Table <span style="color: #000000; background-color: #00ffff;">Level</span> Locking</h3>
The database allows multiple concurrent connections to the same database.
To make sure all connections only see consistent data, table <span style="color: #000000; background-color: #00ffff;">level</span> locking is used.
This mechanism does not allow high concurrency, but is very fast.
Shared locks and exclusive locks are supported.
Before reading from a table, the database tries to add a shared lock to the table
(this is only possible if there is no exclusive lock on the object by another connection).
If the shared lock is added successfully, the table can be read. It is allowed that
other connections also have a shared lock on the same object. If a connection wants
to write to a table (update or delete a row), an exclusive lock is required. To get the
exclusive lock, other connection must not have any locks on the object. After the
connection commits, all locks are released.
This database keeps all locks in memory.<br> <img src ="http://www.blogjava.net/cherishchen/aggbug/126524.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-06-27 11:20 <a href="http://www.blogjava.net/cherishchen/archive/2007/06/27/126524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript tips</title><link>http://www.blogjava.net/cherishchen/archive/2007/06/26/126352.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Tue, 26 Jun 2007 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/06/26/126352.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/126352.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/06/26/126352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/126352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/126352.html</trackback:ping><description><![CDATA[<div style="text-align: center;">The Browser Object Model<br></div>
<br><img src="file:///C:/DOCUME~1/chen/LOCALS~1/Temp/moz-screenshot.jpg" alt=""><img src="http://www.blogjava.net/images/blogjava_net/cherishchen/b1.jpg" border="0"><br><br><br>The window object represents an entire browser window<br><br><br><br>
<div style="text-align: center;">Document Object Model (DOM)<br></div>
<br><br>The Document Object Model (DOM) is perhaps the single greatest innovation on the Web since<br>HTML was first used to connect related documents together over the Internet. The DOM gives<br>developers unprecedented access to HTML, enabling them to manipulate and view HTML as an<br>XML document. The DOM represents the evolution of Dynamic HTML, pioneered by Microsoft<br>and Netscape, into a true cross-platform, language-independent solution.<br><br>Note that the DOM is a language-independent API, meaning that it is not tied to<br>Java, JavaScript, or any other language for implementation. For the purposes of this<br>book, however, I place most focus on the JavaScript implementation.<br><img alt="" src="http://www.blogjava.net/images/blogjava_net/cherishchen/b2.jpg" height="387" width="709"><br><br>   <img src ="http://www.blogjava.net/cherishchen/aggbug/126352.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-06-26 15:58 <a href="http://www.blogjava.net/cherishchen/archive/2007/06/26/126352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 一个模拟webwork的拦截器工作原理的例子 (yuanchuang)</title><link>http://www.blogjava.net/cherishchen/archive/2007/06/25/126150.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 25 Jun 2007 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/06/25/126150.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/126150.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/06/25/126150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/126150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/126150.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;">&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;<br>&nbsp;&nbsp;*&nbsp;&nbsp;模拟webwork的拦截器<br>&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;">&nbsp;&nbsp;<br>&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.ArrayList;&nbsp;&nbsp;<br>&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Iterator;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ActionInvocation&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;executed&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">这个intercepters必须是成员变量</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;Iterator&nbsp;intercepters;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;resultCode;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;invoke()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(executed)&nbsp;{&nbsp;&nbsp;<br>&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;IllegalStateException(</span><span style="color: #000000;">"</span><span style="color: #000000;">Action&nbsp;has&nbsp;already&nbsp;executed</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(intercepters.hasNext())&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;因为intercepters是类成员变量，所以递归执行到这里的时候，会执行一个Intercepter的intercept方法，知道都迭代完毕</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Intercepter&nbsp;intercepter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Intercepter)&nbsp;intercepters.next();&nbsp;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">递归&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;here&nbsp;is&nbsp;recure&nbsp;point&nbsp;,programm&nbsp;run&nbsp;to&nbsp;here&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;then&nbsp;save&nbsp;the&nbsp;state&nbsp;into&nbsp;the&nbsp;stack&nbsp;,and&nbsp;jump&nbsp;to&nbsp;the&nbsp;top&nbsp;of&nbsp;the&nbsp;method&nbsp;run&nbsp;again&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;and&nbsp;so&nbsp;and&nbsp;so&nbsp;util&nbsp;the&nbsp;condition&nbsp;to&nbsp;else&nbsp;branch&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;resultCode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;intercepter.intercept(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;resultCode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;invokeActionOnly();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">executed)&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">now&nbsp;it&nbsp;is&nbsp;time&nbsp;to&nbsp;run&nbsp;the&nbsp;action,&nbsp;and&nbsp;this&nbsp;method&nbsp;should&nbsp;not&nbsp;run&nbsp;again!!</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;executed&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;resultCode;&nbsp;&nbsp;<br>&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;invokeActionOnly()&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">run&nbsp;invokeActionOnly()&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;invoke和intercept的递归的时候返回都将是这个值，所以这个返回值能够保存到最后，&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;只是在两个方法之间被多次地传递&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">here&nbsp;is&nbsp;action&nbsp;return&nbsp;value,it's&nbsp;the&nbsp;result;</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;&nbsp;<br>&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ActionInvocation(){&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;ArrayList&nbsp;ay</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;ay.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Intercepter(</span><span style="color: #000000;">1</span><span style="color: #000000;">));&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;ay.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Intercepter(</span><span style="color: #000000;">2</span><span style="color: #000000;">));&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;ay.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Intercepter(</span><span style="color: #000000;">3</span><span style="color: #000000;">));&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;intercepters</span><span style="color: #000000;">=</span><span style="color: #000000;">ay.iterator();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;}&nbsp;&nbsp;<br>&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(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;ActionInvocation&nbsp;actionInvocation&nbsp;</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ActionInvocation();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(actionInvocation.invoke());&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;}&nbsp;</span></div>
<br><br><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;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Intercepter&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;id;&nbsp;&nbsp;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Intercepter(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;id){&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id</span><span style="color: #000000;">=</span><span style="color: #000000;">id;&nbsp;&nbsp;<br>&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;intercept(ActionInvocation&nbsp;actionInvocation)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">run&nbsp;the&nbsp;intercept()</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;String&nbsp;resultCode</span><span style="color: #000000;">=</span><span style="color: #000000;">actionInvocation.invoke();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">after&nbsp;the&nbsp;action&nbsp;run,run&nbsp;the&nbsp;intercept&nbsp;continue&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;resultCode;&nbsp;&nbsp;<br>&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;}</span></div>
<br>   <img src ="http://www.blogjava.net/cherishchen/aggbug/126150.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-06-25 16:45 <a href="http://www.blogjava.net/cherishchen/archive/2007/06/25/126150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用h2的case函数实现交叉表</title><link>http://www.blogjava.net/cherishchen/archive/2007/06/25/126126.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 25 Jun 2007 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/06/25/126126.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/126126.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/06/25/126126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/126126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/126126.html</trackback:ping><description><![CDATA[数据表<span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">t的ddl：<br>create table t(class char(1),callcount int,calldate date)<br></span><img src="http://www.blogjava.net/images/blogjava_net/cherishchen/a1.jpg" border="0"><br><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US"><br>sql语句:</span>
<p class="MsoNormal" style="margin: 6pt 0cm;"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">select calldate,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm;"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">sum(case class when '1' then callcount else 0 end)
as A</span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US">,<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm;"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">sum(case class when '2' then callcount else 0 end)
as B</span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US">,<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm;"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">sum(case class when '3' then callcount else 0 end)
as C</span><span style="font-size: 10pt; font-family: 宋体;">类 <span lang="EN-US"><o:p></o:p></span></span></p>
<span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">from t group by calldate<br><br>最后结果：<br><img src="http://www.blogjava.net/images/blogjava_net/cherishchen/a2.jpg" border="0"><br><br></span><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US"><!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style="'width:120.75pt;
height:96pt'">
<v:imagedata src="file:///C:\DOCUME~1\chen\LOCALS~1\Temp\msohtml1\01\clip_image001.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><br> <img src ="http://www.blogjava.net/cherishchen/aggbug/126126.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-06-25 15:52 <a href="http://www.blogjava.net/cherishchen/archive/2007/06/25/126126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>