﻿<?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-且行且珍惜</title><link>http://www.blogjava.net/jwshuang21/</link><description>java road</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 09:55:50 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 09:55:50 GMT</pubDate><ttl>60</ttl><item><title>java equals ==  区别</title><link>http://www.blogjava.net/jwshuang21/archive/2009/01/15/251473.html</link><dc:creator>jws-21</dc:creator><author>jws-21</author><pubDate>Thu, 15 Jan 2009 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/jwshuang21/archive/2009/01/15/251473.html</guid><wfw:comment>http://www.blogjava.net/jwshuang21/comments/251473.html</wfw:comment><comments>http://www.blogjava.net/jwshuang21/archive/2009/01/15/251473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jwshuang21/comments/commentRss/251473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jwshuang21/services/trackbacks/251473.html</trackback:ping><description><![CDATA[服务类中有个一判断条件propertys.get(WIN_INDEXMONTH).toString() != "",在tomcat上能正常处理。<br />
但是到weblogic上就出现问题了。<br />
而后改成<br />
if(!"".equals(propertys.get(WIN_INDEXMONTH).toString())){<br />
。。<br />
}<br />
就都正确了。<br />
<br />
equals 是用于比较两个对象的内容是否相等。<br />
== 用于比较基本数据类型 和 引用类型时的区别为<br />
比较两个基本数据类型，若两个值相同则返回true<br />
比较引用时，如果引用指向内存中的同一个对象，则返回true<br />
<br />
String str = new String("aaa");<br />
<br />
str.equals("aaa");---true<br />
str == "aaa";---false
<img src ="http://www.blogjava.net/jwshuang21/aggbug/251473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jwshuang21/" target="_blank">jws-21</a> 2009-01-15 17:32 <a href="http://www.blogjava.net/jwshuang21/archive/2009/01/15/251473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts webwork 比较</title><link>http://www.blogjava.net/jwshuang21/archive/2008/10/20/235466.html</link><dc:creator>jws-21</dc:creator><author>jws-21</author><pubDate>Mon, 20 Oct 2008 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/jwshuang21/archive/2008/10/20/235466.html</guid><wfw:comment>http://www.blogjava.net/jwshuang21/comments/235466.html</wfw:comment><comments>http://www.blogjava.net/jwshuang21/archive/2008/10/20/235466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jwshuang21/comments/commentRss/235466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jwshuang21/services/trackbacks/235466.html</trackback:ping><description><![CDATA[Struts、Webwork比较 <br />
比较内容 Struts WebWork2 <br />
Action &nbsp; 类 在Struts里面，每一个
<br />
Action &nbsp;
Class都需要扩展org.apache.struts.action.Action;这个在Java编程中会引来一些问题，就是关于多种继承的问题
Webwork仅仅需要implement &nbsp; com.opensymphony.xwork.Action &nbsp;
Interface,您也可以implement其它的interface来实现更多的功能，譬如：validate（验证），localware(国际化)等，当然 &nbsp;
webwork2也提供了一个类ActionSupport &nbsp; 集成了以上功能。Developer可以根据需要实现不同的功能。 <br />
线程模型 Struts &nbsp;
Actions必须是thread－safe方式，它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必须统一同步，这个就引起了线程安全的问题。
Webwork &nbsp; 2 &nbsp; actions每一个请求对应一个action，因此没有线程的安全问题。实际上Servlet &nbsp;
容器对应每一个请求会产生许多Object，这种一个请求产生许多object的例子没有证明对性能产生太多的影响。现在Web容器都是这么处理Servlet的。
<br />
Servlet的依赖 Struts处理一个Action时候必须要依赖ServletRequest &nbsp; and &nbsp;
ServletResponse。所以这一层摆脱不了Server容器。而serveltRequest可能会被web层的Context使用。 Webwork2 &nbsp;
每一个action不依赖任何层和任何容器。他们使用Request和response是通过ActionContext，所以这个对于逻辑层的分离是很重要的。
<br />
测试
因为Struts的每一个action都必须用到request和response所以都必须通过web层来进行测试。这就导致了许多测试struts都要通过web容器（尽管现在有许多测试方法cactus
&nbsp; mock &nbsp; 等）。
Webwork的action能够通过赋予一定的属性。就可以执行。同时您可以使用一个mock的实例去测试，而不是通过启动web容器来进行测试。
<br />
FormBean Struts &nbsp;
需要一个FormBeans针对每一个Form。而使用DynaBeans实际上没有太大的意义。不能够很好的处理现有的模型。 Webwork &nbsp;
能够动态的收集web的数据然后在赋值给bean。同时它还能够使用FormBean模式。Webwork2还允许现有的ModelDrvien进行导入处理。能够处理它就像处理action自己的属性一样。
<br />
前端表达语言 Struts大部分使用的是JSTL &nbsp; EL（JSP2。0）去获得数据的。在Collection上面处理显得很弱。
Webwork前端可以使用JSTL同时也可以使用多种表现形式。譬如：velocity &nbsp; freemaker &nbsp; jspparer &nbsp;
xml等等。Webwork2 &nbsp; 利用ongl建立一个valuestack来搜集数据 <br />
类型的转换 Struts &nbsp;
FormBeans把所有的数据都作为string类型。得到一个自己需要的类型然后展示给用户是很困难的。 Webwork2 &nbsp;
数据都是转换成Java中的类型。这个根据Form的类型自动转换。然后操作这些bean十分方便。 <br />
对Action &nbsp; 执行前和后的处理
Struts处理action的时候是基于class的hierarchies，很难在action处理前和后进行操作。 Webwork2 &nbsp;
允许您处理action可以通过interceptor，就是在每一个action处理前或者后进行其它操作。 <br />
验证处理
因为struts的FormBean的属性都被认为是string类型。许多类型的验证都要进行类型转换的处理。FormBean对一个验证链的处理显然不行。
而webwork2的验证采用的是interceptor设计模式。它的这种验证方式决定了它十分灵活。而且一个验证可以重复不断的使用仅仅需要一个XML文件的定义。实际上webwork2的验证是采用了xwork的验证框架。
<br />
Action的链的控制 Struts里面每一个action对应一个处理，如果一个action转向另外一个action就很困难了。
Webwork使用一个强大的DispatcherChain去处理这个action链。很方便的从一个处理到另外一个处理。
<img src ="http://www.blogjava.net/jwshuang21/aggbug/235466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jwshuang21/" target="_blank">jws-21</a> 2008-10-20 14:53 <a href="http://www.blogjava.net/jwshuang21/archive/2008/10/20/235466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 中事务管理的配置和注入</title><link>http://www.blogjava.net/jwshuang21/archive/2008/10/09/233312.html</link><dc:creator>jws-21</dc:creator><author>jws-21</author><pubDate>Thu, 09 Oct 2008 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/jwshuang21/archive/2008/10/09/233312.html</guid><wfw:comment>http://www.blogjava.net/jwshuang21/comments/233312.html</wfw:comment><comments>http://www.blogjava.net/jwshuang21/archive/2008/10/09/233312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jwshuang21/comments/commentRss/233312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jwshuang21/services/trackbacks/233312.html</trackback:ping><description><![CDATA[<p>在spring基础文件中配置数据源，事务管理和事务管理代理bean的。</p>
<p><font style="background-color: #cce8cf">&nbsp;&lt;!-- ======================== Properties&nbsp; ======================== --&gt;<br />
&nbsp;&lt;bean id="propertyConfigurer"<br />
&nbsp;&nbsp;class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br />
&nbsp;&nbsp;&lt;property name="locations"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;classpath*:conf/configure.properties&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</font></p>
<p><font style="background-color: #cce8cf">&nbsp;&lt;!-- ========================&nbsp;&nbsp; data configure&nbsp;&nbsp; ========================== --&gt;<br />
&nbsp;&lt;!-- Apache Database Connection Pool&nbsp; --&gt;<br />
&nbsp;&lt;bean id="dataSource"&lt;!--BasicDataSource类的别名--&gt;<br />
&nbsp;&nbsp;class="org.apache.commons.dbcp.BasicDataSource""&lt;!--BasicDataSource类的别名所指向的真正类--&gt;<br />
&nbsp;&nbsp;destroy-method="close"&gt;<br />
&nbsp;&nbsp;&lt;property name="driverClassName"&gt;"&lt;!--对应到BasicDataSource类中的属性--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;${db.driver}&lt;/value&gt;"&lt;!--该属性值绑定到BasicDataSource类中的属性此处为property中name多对应的属性--&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="url"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;${db.url}&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="username"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;${db.user}&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="password"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;${db.password}&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="initialSize"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;15&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="maxActive"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;30&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="maxIdle"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;30&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="minIdle"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;5&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
<br />
</p>
<p><font style="background-color: #cce8cf">&lt;!-- Transaction manager for a single JDBC DataSource DAO IoC --&gt;<br />
&nbsp;&lt;bean id="transactionManager"<br />
&nbsp;&nbsp;class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />
&nbsp;&nbsp;&lt;property name="dataSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref local="dataSource" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
<br />
<font style="background-color: #cce8cf">&lt;!--<br />
&nbsp;&nbsp;- A parent bean definition which is a base definition for transaction proxies.<br />
&nbsp;&nbsp;- It's marked as abstract, since it's not supposed to be instantiated itself.<br />
&nbsp;&nbsp;- We set shared transaction attributes here, following our naming patterns.<br />
&nbsp;&nbsp;- The attributes can still be overridden in child bean definitions.&nbsp;&nbsp; <br />
&nbsp;&nbsp;-&nbsp;&nbsp; <br />
&nbsp;--&gt;<br />
&nbsp;&lt;bean id="baseTransactionProxy"<br />
&nbsp;&nbsp;class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"<br />
&nbsp;&nbsp;abstract="true"&gt;&lt;!-- 为了避免ApplicationContext对它预先的初始化&nbsp;--&gt;<br />
&nbsp;&nbsp;&lt;property name="transactionManager"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="transactionManager" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="transactionAttributes"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="insert*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="delete*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/props&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</font></font></p>
<p><font style="background-color: #cce8cf">&nbsp;&lt;/bean&gt;<br />
如果有很多的bean的某些定义都是类似的(比如对于transaction的定义)，那么可以给他们的定义作一个模板。<br />
使用parent可以实现这一点。(注意parent并非意味着两个bean之间存在着java的继承关系，只是表示他们的定义之间存在着共同的部分)。<br />
child bean使用parent来继承模板的定义，同样还可以覆盖模板的定义。<br />
很多时候模板并不需要被实例化，为了避免ApplicationContext对它预先的初始化，一般设置abstract="true"<br />
为了提高事务代理的复用程度，没有在baseTransactionProxy设置target属性。此时设置abstract="true"<br />
下面以一个用户管理<font style="background-color: #cce8cf">UserInfo 用户管理模块</font>为例，设置模块中各个bean的依赖注入和事务的管理<br />
首先定义service实现类<br />
</p>
<p><font style="background-color: #cce8cf">&nbsp;&lt;!-- user target bean --&gt;<br />
&nbsp;&lt;bean id="userTarget"<br />
&nbsp;&nbsp;class="com.zhjy.gmp.service.impl.UserInfoServiceImpl"&gt;<br />
&nbsp;&nbsp;&lt;property name="userDAO"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref local="userDAO" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;!-- 部门DAO --&gt;<br />
&nbsp;&nbsp;&lt;property name="orgDAO"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref local="orgInfoDAO" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;</font></p>
<p><font style="background-color: #cce8cf">&nbsp;&nbsp;&lt;!-- 角色DAO --&gt;<br />
&nbsp;&nbsp;&lt;property name="roleDAO"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref local="roleDAO" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;</font></p>
<p><font style="background-color: #cce8cf">&nbsp;&lt;/bean&gt;<br />
这里注入了UserInfoServiceImpl所需要的三个dao实例。<br />
接下来对该service进行事务管理的配置<font style="background-color: #cce8cf"><br />
&nbsp;&lt;!-- user service bean --&gt;<br />
&nbsp;&lt;bean id="userService" parent="baseTransactionProxy"&gt;<br />
&nbsp;&nbsp;&lt;property name="target"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="userTarget" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
此处通过target属性将userTarget实例注入到事务代理中。<br />
最后定义dao实例<br />
<font style="background-color: #cce8cf">&nbsp;&lt;!-- user dao bean --&gt;<br />
&nbsp;&lt;bean id="userDAO" class="com.zhjy.gmp.dao.impl.UserInfoDAOImpl"&gt;<br />
&nbsp;&nbsp;&lt;property name="dataSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="dataSource" /&gt;&lt;!-- ref bean 与 ref&nbsp;local&nbsp;的区别，后者表示从本地的(同一个)xml文件中来寻找bean，前者是全局范围内寻找bean。&nbsp;--&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
</font><font style="background-color: #cce8cf">&nbsp;&lt;/bean&gt;</font></p>
<p><br />
</font><br />
</font></p>
<p><br />
</p>
<p><br />
</font></p>
</font>
<img src ="http://www.blogjava.net/jwshuang21/aggbug/233312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jwshuang21/" target="_blank">jws-21</a> 2008-10-09 11:30 <a href="http://www.blogjava.net/jwshuang21/archive/2008/10/09/233312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 事务管理之 声明式事务管理</title><link>http://www.blogjava.net/jwshuang21/archive/2008/10/08/233176.html</link><dc:creator>jws-21</dc:creator><author>jws-21</author><pubDate>Wed, 08 Oct 2008 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/jwshuang21/archive/2008/10/08/233176.html</guid><wfw:comment>http://www.blogjava.net/jwshuang21/comments/233176.html</wfw:comment><comments>http://www.blogjava.net/jwshuang21/archive/2008/10/08/233176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jwshuang21/comments/commentRss/233176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jwshuang21/services/trackbacks/233176.html</trackback:ping><description><![CDATA[spring提供声明式事务管理，这是通过aop实现的，这是最少影响应用代码的选择。<br />
通常通过<font style="background-color: #cce8cf">TransactionProxyFactoryBean</font>实现事务代理。需要一个目标对象包装在事务代理中。当我们定义<font style="background-color: #cce8cf">TransactionProxyFactoryBean是，我们需要一个关于PlatformTransactionManager的实现引用和事务属性，是无属性含有事务定义。<br />
<font style="background-color: #cce8cf">
<p><br />
&nbsp;&lt;bean id="transactionManager"<br />
&nbsp;&nbsp;class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />
&nbsp;&nbsp;&lt;property name="dataSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref local="dataSource" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;</p>
<p>&nbsp;&lt;/bean&gt;<br />
以上代码是关于PlatformTransactionManager的实现类的定义。在事务代理定义中将引用这个javabean。<br />
<font style="background-color: #cce8cf"><br />
&nbsp;&lt;bean id="baseTransactionProxy"<br />
&nbsp;&nbsp;class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"<br />
&nbsp;&nbsp;abstract="true"&gt;<br />
&nbsp;&nbsp;&lt;property name="transactionManager"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="transactionManager" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="transactionAttributes"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="insert*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="delete*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/props&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
此处是定义事务代理，其中应用了关于PlatformTransactionManager的实现和事务属性。<br />
<br />
spring中的事务策略<br />
spring事务抽象的关键是事务策略的概念。这个概念由 <tt class="literal">org.springframework.transaction.PlatformTransactionManager</tt> 接口体现。<br />
<font style="background-color: #cce8cf"></p>
<p><br />
public interface PlatformTransactionManager<br />
{</p>
<p>&nbsp;&nbsp;&nbsp; public abstract TransactionStatus getTransaction(TransactionDefinition transactiondefinition)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws TransactionException;</p>
<p>&nbsp;&nbsp;&nbsp; public abstract void commit(TransactionStatus transactionstatus)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws TransactionException;</p>
<p>&nbsp;&nbsp;&nbsp; public abstract void rollback(TransactionStatus transactionstatus)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws TransactionException;<br />
}</font></p>
<p>getTransaction根据一个类型为TransactionDefinition 参数返回一个TransactionStatus 类型的对象，返回的 <tt class="literal">TransactionStatus</tt>对象可能代表一个新的或已经存在的事 务（如果在当前调用堆栈有一个符合条件的事务）。<br />
</p>
<p><tt class="literal">TransactionDefinition</tt>接口指定：</p>
<div class="itemizedlist">
<ul type="disc">
    <li>
    <p><span class="bold"><strong>事务隔离</strong></span>：当前事务和其它事务的隔离的程度。 例如，这个事务能否看到其他事务未提交的写数据？</p>
    <li>
    <p><span class="bold"><strong>事务传播</strong></span>：通常在一个事务中执行的 所有代码都会在这个事务中运行。但是，如果一个事务上下文已经存在， 有几个选项可以指定一个事务性方法的执行行为：例如，简单地在现有的 事务中运行（大多数情况）；或者挂起现有事务，创建一个新的事务。 Spring提供EJB CMT中熟悉的事务传播选项。</p>
    <li>
    <p><span class="bold"><strong>事务超时</strong></span>: 事务在超时前能运行多 久（自动被底层的事务基础设施回滚）。</p>
    <li>
    <p><span class="bold"><strong>只读状态</strong></span>: 只读事务不修改任何数 据。只读事务在某些情况下（例如当使用Hibernate时）可可是一种非常有用的优化</p>
    </li>
</ul>
</div>
<p><font face="Courier New"></font>PlatformTransactionManager实现是如何定义的，它将和JDBC一起工作<br />
首先需要定义jdbc数据源。然后使用<font style="background-color: #cce8cf">DataSourceTransactionManager</font>，为它提供一个数据源引用。<br />
&lt;bean id="dataSource"&nbsp; &lt;!--&nbsp;BasicDataSource的别名&nbsp;--&gt;<br />
&nbsp;&nbsp;&nbsp; class="org.apache.commons.dbcp.BasicDataSource"&nbsp;&nbsp;&lt;!--&nbsp;BasicDataSource类的别名所对应的类&nbsp;--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;destroy-method="close"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="driverClassName"&gt;&lt;!-- 对应BasicDataSource类中的属性&nbsp;--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;${jdbc.driverClassName}&lt;/value&gt;&lt;!-- 该属性值将绑定到BasicDataSource上所对应的属性上(driverClassName)&nbsp;--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="url"&gt;&lt;value&gt;${jdbc.url}&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="username"&gt;&lt;value&gt;${jdbc.username}&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="password"&gt;&lt;value&gt;${jdbc.password}&lt;/value&gt;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
PlatformTransactionManager的定义如下.<br />
<br />
&nbsp;&lt;bean id="transactionManager"<br />
&nbsp;&nbsp;class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />
&nbsp;&nbsp;&lt;property name="dataSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref local="dataSource" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt; </p>
<p>&nbsp;&lt;/bean&gt;<br />
<br />
</p>
<p>如果我们使用JTA， 我们需要使用通过JNDI获得的容器数据源，和一个JtaTransactionManager实 现。JtaTransactionManager不需要知道数据源，或任何其他特定资源，因为它将 使用容器的全局事务管理。</p>
<pre class="programlisting">&lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;
&lt;property name="jndiName"&gt;&lt;value&gt;jdbc/jpetstore&lt;/value&gt;&lt;/property&gt;
&lt;/bean&gt;
&lt;bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager"/&gt;</pre>
<pre class="programlisting">&nbsp;</pre>
<pre class="programlisting">使用hibernate局部事务的配置</pre>
<pre class="programlisting">
<p>在这种情况下，我们需要定义一个Hibernate的LocalSessionFactory，应用程 序将使用它获得Hibernate的会话。</p>
<p>数据源bean定义和上面例子类似，这里不再罗列（如果这是容器数据源，它应该是非事务的，因为Spring会管理事务， 而不是容器）。</p>
<p>这种情况下，&#8220;transactionManager&#8221; bean的类型是HibernateTransactionManager。<br />
和DataSourceTransactionManager拥有一个数据源的引用一样， HibernateTransactionManager需要一个SessionFactory的引用。</p>
<pre class="programlisting">&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"&gt;
&lt;property name="dataSource"&gt;&lt;ref local="dataSource"/&gt;&lt;/property&gt;
&lt;property name="mappingResources"&gt;
&lt;value&gt;org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml&lt;/value&gt;
&lt;/property&gt;
&lt;property name="hibernateProperties"&gt;
&lt;props&gt;
&lt;prop key="hibernate.dialect"&gt;${hibernate.dialect}&lt;/prop&gt;
&lt;/props&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;bean id="transactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt;
&lt;property name="sessionFactory"&gt;&lt;ref local="sessionFactory"/&gt;&lt;/property&gt;
&lt;/bean&gt;</pre>
</pre>
<p><br />
&nbsp;</p>
<p><br />
<br />
<br />
</font><br />
</font>&nbsp;</p>
<br />
</font>
<img src ="http://www.blogjava.net/jwshuang21/aggbug/233176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jwshuang21/" target="_blank">jws-21</a> 2008-10-08 16:58 <a href="http://www.blogjava.net/jwshuang21/archive/2008/10/08/233176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ibatis学习</title><link>http://www.blogjava.net/jwshuang21/archive/2008/10/07/ibatis.html</link><dc:creator>jws-21</dc:creator><author>jws-21</author><pubDate>Tue, 07 Oct 2008 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/jwshuang21/archive/2008/10/07/ibatis.html</guid><wfw:comment>http://www.blogjava.net/jwshuang21/comments/232958.html</wfw:comment><comments>http://www.blogjava.net/jwshuang21/archive/2008/10/07/ibatis.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jwshuang21/comments/commentRss/232958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jwshuang21/services/trackbacks/232958.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="word-spacing: 0px; font: 13px/23px Verdana; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 10px; -webkit-border-vertical-spacing: 10px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0">ibatis 开发指南<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
相对Hibernate和Apache OJB 等&#8220;一站式&#8221;ORM解决方案而言，ibatis 是一种&#8220;半<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
自动化&#8221;的ORM实现。<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
所谓&#8220;半自动&#8221;，可能理解上有点生涩。纵观目前主流的ORM，无论Hibernate 还是<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
Apache OJB，都对数据库结构提供了较为完整的封装，提供了从POJO 到数据库表的全<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
套映射机制。程序员往往只需定义好了POJO 到数据库表的映射关系，即可通过Hibernate<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
或者OJB 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握，<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
Hibernate/OJB 会根据制定的存储逻辑，自动生成对应的SQL 并调用JDBC 接口加以执<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
行。<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
大多数情况下（特别是对新项目，新系统的开发而言），这样的机制无往不利，大有一<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
统天下的势头。但是，在一些特定的环境下，这种一站式的解决方案却未必灵光。<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
在笔者的系统咨询工作过程中，常常遇到以下情况：<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
1． 系统的部分或全部数据来自现有数据库，处于安全考虑，只对开发团队提供几<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
条Select SQL（或存储过程）以获取所需数据，具体的表结构不予公开。<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
2． 开发规范中要求，所有牵涉到业务逻辑部分的数据库操作，必须在数据库层由<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
存储过程实现（就笔者工作所面向的金融行业而言，工商银行、中国银行、交<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
通银行，都在开发规范中严格指定）<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
3． 系统数据处理量巨大，性能要求极为苛刻，这往往意味着我们必须通过经过高<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
度优化的SQL语句（或存储过程）才能达到系统性能设计指标。<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
面对这样的需求，再次举起Hibernate 大刀，却发现刀锋不再锐利，甚至无法使用，<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
奈何？恍惚之际，只好再摸出JDBC 准备拼死一搏&#8230;&#8230;，说得未免有些凄凉，直接使用JDBC<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
进行数据库操作实际上也是不错的选择，只是拖沓的数据库访问代码，乏味的字段读取操作<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
令人厌烦。<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
&#8220;半自动化&#8221;的ibatis，却刚好解决了这个问题。<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
这里的&#8220;半自动化&#8221;，是相对Hibernate等提供了全面的数据库封装机制的&#8220;全自动化&#8221;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
ORM 实现而言，&#8220;全自动&#8221;ORM 实现了POJO 和数据库表之间的映射，以及SQL 的自动<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
生成和执行。而ibatis 的着力点，则在于POJO 与SQL之间的映射关系。也就是说，ibatis<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写，然后通过映<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
射配置文件，将SQL所需的参数，以及返回的结果字段映射到指定POJO。<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
使用ibatis 提供的ORM机制，对业务逻辑实现人员而言，面对的是纯粹的Java对象，<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
这一层与通过Hibernate 实现ORM 而言基本一致，而对于具体的数据操作，Hibernate<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
会自动生成SQL 语句，而ibatis 则要求开发者编写具体的SQL 语句。相对Hibernate等<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
&#8220;全自动&#8221;ORM机制而言，ibatis 以SQL开发的工作量和数据库移植性上的让步，为系统<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
设计提供了更大的自由空间。作为&#8220;全自动&#8221;ORM 实现的一种有益补充，ibatis 的出现显<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
得别具意义。</span>
<img src ="http://www.blogjava.net/jwshuang21/aggbug/232958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jwshuang21/" target="_blank">jws-21</a> 2008-10-07 17:23 <a href="http://www.blogjava.net/jwshuang21/archive/2008/10/07/ibatis.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate3  annotation学习</title><link>http://www.blogjava.net/jwshuang21/archive/2008/08/12/221489.html</link><dc:creator>jws-21</dc:creator><author>jws-21</author><pubDate>Tue, 12 Aug 2008 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/jwshuang21/archive/2008/08/12/221489.html</guid><wfw:comment>http://www.blogjava.net/jwshuang21/comments/221489.html</wfw:comment><comments>http://www.blogjava.net/jwshuang21/archive/2008/08/12/221489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jwshuang21/comments/commentRss/221489.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jwshuang21/services/trackbacks/221489.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 对于采用hibernate方式实现数据持久化映射的方式，过去,Hibernate 依靠外部的XML文件来配置持久化对象,数据库映射文件定义在一组XML映射文件里并且在程序开始的时候被装载。最近的Hibernate版本里,一个新的建立在Java 5 注解之上更为优雅的方法出现了.利用新的Hibernate Annonations 库,你可以发布一次如你以前的映射文件所定义的信息。<br />
&nbsp;&nbsp;&nbsp; 为 了使用Hibernate Annotations,你需要最新的Hibernate 3.2 ,当然还有Java 5 你可以在Hibernate web site 这个网站下载Hibernate 3.2和Hibernate Annotations库.除了标准的Hibernate 库文件和必须的依赖库之外,还需要下载 Hibernate Annotations库和Java 持久化API ---ejb3-persstence.jar文件。<br />
&nbsp;&nbsp;&nbsp; 在hibernate配置文件中声明采用Hibernate Annotations方式配置的hibernate sessionFactory，具体配置如下：<br />
</p>
<p>&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="dataSource" ref="dataSource" /&gt;<br />
&nbsp;&nbsp;&lt;property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/&gt;<br />
&nbsp;&nbsp;&lt;property name="configLocations"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;classpath*:conf/hibernate.cfg.xml&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- 在此声明配置文件里声明持久化类，如hibernate.cfg.xml文件内容如下<br />
&nbsp;&lt;hibernate-configuration&gt;<br />
&nbsp;&lt;session-factory&gt;<br />
&nbsp;&nbsp;&lt;mapping class="com.zhjy.gea.module.assessment.appraisal.domain.Appraisal" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- 声明的持久化类--&gt;&nbsp;&nbsp;<br />
&nbsp;&lt;/session-factory&gt;<br />
&lt;/hibernate-configuration&gt;<br />
<br />
&nbsp;--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="mappingDirectoryLocations"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&#215;&#215;&#215;&#215;&#215;&#215;&#215;<br />
&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="lobHandler" ref="lobHandler" /&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernateProperties"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.cache.provider_class"&gt;org.hibernate.cache.EhCacheProvider&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.Oracle9Dialect&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.cache.use_query_cache"&gt;true&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.hbm2ddl.auto"&gt;false&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.max_fetch_depth"&gt;2&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.jdbc.fetch_size"&gt;50&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.jdbc.batch_size"&gt;50&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.use_outer_join"&gt;true&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/props&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.OscarDialect&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.cglib.use_reflection_optimizer"&gt;true&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/props --&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
在此声明了一个基于Annotations 的Hibernate Session Factory。<br />
如果你集成spring，你也可以采用<br />
&lt;bean id="sessionFactory" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="dataSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="dataSource"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="hibernateProperties"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.DerbyDialect&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.hbm2ddl.auto"&gt;create&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="annotatedClasses"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;com.onjava.modelplanes.domain.PlaneType&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;com.onjava.modelplanes.domain.ModelPlane&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&lt;/bean&gt;<br />
方式来声明sessionFactory类。</p>
<strong><span style="font-size: 16px">映射关系</span></strong>：Onetomany<br />
<br />
<br />
实体类对应表名的注解<br />
&nbsp;例：<br />
&nbsp;&nbsp;
<p>@SuppressWarnings("serial")<br />
@Entity<br />
@Table(name = "GEA_APPRAISAL")//这里对应数据库中的表名<br />
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)//采用缓存设置<br />
public class Appraisal extends BaseAssessment {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; @OneToMany(mappedBy="appraisal",cascade ={CascadeType.ALL},fetch=FetchType.LAZY)//mappedBy="appraisal"<br />
//这个appraisal对应的是many一端即Buy实体类里面的one属性，即AppraisalEvent中定义的ManyToOne中One对应的//实体类.<br />
&nbsp;&nbsp;&nbsp; @OrderBy("ranking")//many方按ranking排序<br />
&nbsp;&nbsp;&nbsp; //@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)<br />
&nbsp;&nbsp;&nbsp; private List&lt;AppraisalEvent&gt; appraisalEvents = new ArrayList&lt;AppraisalEvent&gt;();<br />
<br />
</p>
&nbsp;对应的Many方的配置ManyToOne<br />
<br />
<p>@SuppressWarnings("serial")<br />
@Entity<br />
@Table(name = "GEA_APPRAISALEVENT")<br />
public class AppraisalEvent extends BaseAssessment {<br />
&nbsp;&nbsp;&nbsp; @ManyToOne(cascade ={CascadeType.PERSIST,CascadeType.MERGE})<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name = "Id")&nbsp;&nbsp; //这个Id是one一边对应数据库中的主键名<br />
&nbsp;&nbsp;&nbsp; /**&nbsp;对应的One方的实体类 */<br />
&nbsp;&nbsp;&nbsp; private Appraisal appraisal;<br />
在many方的表中自动生成appraisal_id字段与One所指的实体类映射的表的主键关联，实际的数据库表关联语句为<br />
alter table GEA_APPRAISALEVENT<br />
&nbsp; add constraint FKCC003B712ABC052 foreign key (APPRAISAL_ID)<br />
&nbsp; references GEA_APPRAISAL (ID);</p>
<img src ="http://www.blogjava.net/jwshuang21/aggbug/221489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jwshuang21/" target="_blank">jws-21</a> 2008-08-12 14:32 <a href="http://www.blogjava.net/jwshuang21/archive/2008/08/12/221489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于struts 中 LazyValidatorForm 模式的学习</title><link>http://www.blogjava.net/jwshuang21/archive/2008/08/05/LazyValidatorForm.html</link><dc:creator>jws-21</dc:creator><author>jws-21</author><pubDate>Tue, 05 Aug 2008 04:15:00 GMT</pubDate><guid>http://www.blogjava.net/jwshuang21/archive/2008/08/05/LazyValidatorForm.html</guid><wfw:comment>http://www.blogjava.net/jwshuang21/comments/220129.html</wfw:comment><comments>http://www.blogjava.net/jwshuang21/archive/2008/08/05/LazyValidatorForm.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jwshuang21/comments/commentRss/220129.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jwshuang21/services/trackbacks/220129.html</trackback:ping><description><![CDATA[<p>struts 中LazyValidatorForm特别适用于FormBean中并不包含POJO商业对象<strong>所有属性</strong>的情况，因为通常项目里都属于这种情况，所以springside默认使用lazyValidatorForm.&nbsp;<br />
&nbsp;&nbsp;&nbsp; 比如User对象 有 id,name,status三个属性，而form表单中只有id和name两个input框，如果使用其他模式，直接把user 作为 form bean,&nbsp; user对象的status因为没设值，将为null，&nbsp; copy 到作为商业对象的user时，就会以null覆盖原值。而lazyBean就没有这个问题，如果form中没有status属性，它不会将它copy给商业对象。<br />
&nbsp;&nbsp;&nbsp; 实际工程中将封装beanUtils中的copyProperties方法，用于将form中的属性绑定到实体对象中，<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 将FormBean中的内容通过BeanUtils的copyProperties()绑定到Object中.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 因为BeanUtils中两个参数的顺序很容易搞错，因此封装此函数.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; protected void bindEntity(ActionForm form, Object object)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (form != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanUtils.copyProperties(object, form);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReflectionUtils.handleReflectionException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
注意实体对象被自动绑定，默认Integer id 在空值时会被赋值为0，需要增加converter，让其默认为null，虽然也可以在web.xml里进行相关配置，但还是在基类里配置了比较安全。在工程中可以这样实现<br />
&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 设置Struts 中数字&lt;-&gt;字符串转换，字符串为空值时,数字默认为null，而不是0.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 也可以在web.xml中设置struts的参数达到相同效果，在这里设置可以防止用户漏设web.xml.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static void registConverter()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConvertUtils.register(new StringConvert("yyyy-MM-dd"), String.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConvertUtils.register(new IntegerConverter(null), Integer.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConvertUtils.register(new LongConverter(null), Long.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConvertUtils.register(new FloatConverter(null), Float.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConvertUtils.register(new DoubleConverter(null), Double.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConvertUtils.register(new DateConvert("yyyy-MM-dd"), Date.class);<br />
&nbsp;&nbsp;&nbsp; }</p>
将属性绑定过程中的一些空默认值修改为null
<img src ="http://www.blogjava.net/jwshuang21/aggbug/220129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jwshuang21/" target="_blank">jws-21</a> 2008-08-05 12:15 <a href="http://www.blogjava.net/jwshuang21/archive/2008/08/05/LazyValidatorForm.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>