﻿<?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-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;明月松间照 清泉石上流-随笔分类-Spring</title><link>http://www.blogjava.net/xuechen0721/category/13824.html</link><description>&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;———&amp;nbsp;兵临城下&amp;nbsp;&amp;nbsp;猫科动物</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 09:18:30 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 09:18:30 GMT</pubDate><ttl>60</ttl><item><title>Spring 学习笔记（二）</title><link>http://www.blogjava.net/xuechen0721/archive/2006/12/06/85737.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Wed, 06 Dec 2006 00:45:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/12/06/85737.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/85737.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/12/06/85737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/85737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/85737.html</trackback:ping><description><![CDATA[
		<div class="titlepage">
				<div>
						<div>
								<h3 class="title">
										<a name="d0e5820">
										</a>事务管理策略 </h3>
						</div>
				</div>
				<div>
				</div>
		</div>
		<p>
				<tt class="classname">TransactionTemplate</tt> 和<tt class="classname">TransactionInterceptor</tt> 都是将真正的事务处理代理给一个<tt class="classname">PlatformTransactionManager</tt>实例， 比如在Hibernate应用中它可以是一个<tt class="classname">HibernateTransactionManager</tt> （对于单独一个的Hibernat SessionFactory， 实质上使用一个ThreadLocal的Session）或一个<tt class="classname">JtaTransactionManager</tt> （代理给容器的JTA子系统）。 你甚至可以使用自定义的<tt class="classname">PlatformTransactionManager</tt>的实现。 所以呢，如果你的应用需要分布式事务的时候， 将原来的Hibernate事务管理转变为JTA之类的，只不过是改变配置文件的事情。 简单地，将Hibernate transaction manager替换为Spring的JTA transaction实现。 事务的划分和数据访问代码则不需要改变，因为他们使用的是通用的事务管理API。 对于横跨多个Hibernate SessionFacotry的分布式事务， 只需简单地将<tt class="classname">JtaTransactionManager</tt> 同多个<tt class="classname">LocalSessionFactoryBean</tt> 定义结合起来作为一个事务策略。 你的每一个DAO通过bean属性得到各自的SessionFactory引用。 如果所有的底层JDBC datasource都是支持事务的容器， 那么只要一个业务对象使用了 <tt class="classname">JtaTransactionManager</tt>策略， 它就可以横跨多个DAO和多个session factories来划分事务，而不需要特殊的对待.</p>
		<pre class="programlisting">&lt;beans&gt;

    &lt;bean id="myDataSource1" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;
        &lt;property name="jndiName"&gt;
            &lt;value&gt;java:comp/env/jdbc/myds1&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="myDataSource2" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;
        &lt;property name="jndiName"&gt;
            &lt;value&gt;java:comp/env/jdbc/myds2&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="mySessionFactory1" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"&gt;
        &lt;property name="mappingResources"&gt;
            &lt;list&gt;
                &lt;value&gt;product.hbm.xml&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
        &lt;property name="hibernateProperties"&gt;
            &lt;props&gt;
                &lt;prop key="hibernate.dialect"&gt;net.sf.hibernate.dialect.MySQLDialect&lt;/prop&gt;
            &lt;/props&gt;
        &lt;/property&gt;
        &lt;property name="dataSource"&gt;
            &lt;ref bean="myDataSource1"/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="mySessionFactory2" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"&gt;
        &lt;property name="mappingResources"&gt;
            &lt;list&gt;
                &lt;value&gt;inventory.hbm.xml&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
        &lt;property name="hibernateProperties"&gt;
            &lt;props&gt;
                &lt;prop key="hibernate.dialect"&gt;net.sf.hibernate.dialect.OracleDialect&lt;/prop&gt;
            &lt;/props&gt;
        &lt;/property&gt;
        &lt;property name="dataSource"&gt;
            &lt;ref bean="myDataSource2"/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="myTransactionManager" 
        class="org.springframework.transaction.jta.JtaTransactionManager"/&gt;

    &lt;bean id="myProductDao" class="product.ProductDaoImpl"&gt;
        &lt;property name="sessionFactory"&gt;
            &lt;ref bean="mySessionFactory1"/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="myInventoryDao" class="product.InventoryDaoImpl"&gt;
        &lt;property name="sessionFactory"&gt;
            &lt;ref bean="mySessionFactory2"/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="myProductServiceTarget" class="product.ProductServiceImpl"&gt;
        &lt;property name="productDao"&gt;
            &lt;ref bean="myProductDao"/&gt;
        &lt;/property&gt;
        &lt;property name="inventoryDao"&gt;
            &lt;ref bean="myInventoryDao"/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="myProductService" 
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;
        &lt;property name="transactionManager"&gt;
            &lt;ref bean="myTransactionManager"/&gt;
        &lt;/property&gt;
        &lt;property name="target"&gt;
            &lt;ref bean="myProductServiceTarget"/&gt;
        &lt;/property&gt;
        &lt;property name="transactionAttributes"&gt;
            &lt;props&gt;
                &lt;prop key="increasePrice*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
                &lt;prop key="someOtherBusinessMethod"&gt;PROPAGATION_MANDATORY&lt;/prop&gt;
            &lt;/props&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</pre>
		<p>
				<tt class="classname">HibernateTransactionManager</tt> 和<tt class="classname">JtaTransactionManager</tt> 都使用了与容器无关的Hibernate事务管理器的lookup或JCA连接器（只要事务不是用EJB发起的）， 从而考虑到在适当JVM级别上的cache处理。 而且<tt class="classname">HibernateTransactionManager</tt> 能够为普通的JDBC访问代码输出JDBC Connection。 这就可以使得混合的Hibernate/JDBC数据访问可以不用JTA而在高层次上进行事务划分， 只要它们使用的是同一个数据库!</p>
<img src ="http://www.blogjava.net/xuechen0721/aggbug/85737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-12-06 08:45 <a href="http://www.blogjava.net/xuechen0721/archive/2006/12/06/85737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 学习笔记（一）</title><link>http://www.blogjava.net/xuechen0721/archive/2006/12/04/85315.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Mon, 04 Dec 2006 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/12/04/85315.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/85315.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/12/04/85315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/85315.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/85315.html</trackback:ping><description><![CDATA[声明式的事务划分
<div></div><p>我们可以使用Spring的AOP TransactionInterceptor来替换事务划分的手工代码， 这需要在application context中定义interceptor。 这个方案使得你可以把业务对象从每个业务方法中重复的事务划分代码中解放出来。 此外，像传播行为和隔离级别等事务概念能够在配置文件中改变，而不会影响业务对象的实现。 </p><pre class="programlisting">&lt;beans&gt;

    ...

    &lt;bean id="myTransactionManager" 
        class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt;
        &lt;property name="sessionFactory"&gt;
            &lt;ref bean="mySessionFactory"/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="myTransactionInterceptor" 
        class="org.springframework.transaction.interceptor.TransactionInterceptor"&gt;
        &lt;property name="transactionManager"&gt;
            &lt;ref bean="myTransactionManager"/&gt;
        &lt;/property&gt;
        &lt;property name="transactionAttributeSource"&gt;
            &lt;value&gt;
                product.ProductService.increasePrice*=PROPAGATION_REQUIRED
                product.ProductService.someOtherBusinessMethod=PROPAGATION_MANDATORY
            &lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="myProductServiceTarget" class="product.ProductServiceImpl"&gt;
        &lt;property name="productDao"&gt;
            &lt;ref bean="myProductDao"/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="myProductService" class="org.springframework.aop.framework.ProxyFactoryBean"&gt;
        &lt;property name="proxyInterfaces"&gt;
            &lt;value&gt;product.ProductService&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name="interceptorNames"&gt;
            &lt;list&gt;
                &lt;value&gt;myTransactionInterceptor&lt;/value&gt;
                &lt;value&gt;myProductServiceTarget&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</pre><pre class="programlisting">public class ProductServiceImpl implements ProductService {

    private ProductDao productDao;

    public void setProductDao(ProductDao productDao) {
        this.productDao = productDao;
    }

    public void increasePriceOfAllProductsInCategory(final String category) {
        List productsToChange = this.productDAO.loadProductsByCategory(category);
        ...
    }

    ...

}<br /><br /><br /><br /><br /><br /><br /><br />一个简便可选的创建声明式事务的方法是：<tt class="classname">TransactionProxyFactoryBean</tt>， 特别是在没有其他AOP interceptor牵扯到的情况下。对一个特定的目标bean，<br /><tt class="classname">TransactionProxyFactoryBean</tt>用事务配置自己联合proxy定义。 这样就把配置工作减少为配置一个目标bean以及一个 proxy bean的定义<br />（少了interceptor的定义）。 此外你也不需要指定事务方法定义在哪一个接口或类中。 <pre class="programlisting">&lt;beans&gt;

    ...

    &lt;bean id="myTransactionManager" 
        class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt;
        &lt;property name="sessionFactory"&gt;
            &lt;ref bean="mySessionFactory"/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="myProductServiceTarget" class="product.ProductServiceImpl"&gt;
        &lt;property name="productDao"&gt;
            &lt;ref bean="myProductDao"/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="myProductService" 
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;
        &lt;property name="transactionManager"&gt;
            &lt;ref bean="myTransactionManager"/&gt;
        &lt;/property&gt;
        &lt;property name="target"&gt;
            &lt;ref bean="myProductServiceTarget"/&gt;
        &lt;/property&gt;
        &lt;property name="transactionAttributes"&gt;
            &lt;props&gt;
                &lt;prop key="increasePrice*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
                &lt;prop key="someOtherBusinessMethod"&gt;PROPAGATION_MANDATORY&lt;/prop&gt;
            &lt;/props&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</pre></pre><img src ="http://www.blogjava.net/xuechen0721/aggbug/85315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-12-04 11:57 <a href="http://www.blogjava.net/xuechen0721/archive/2006/12/04/85315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 整合Struts的问题！</title><link>http://www.blogjava.net/xuechen0721/archive/2006/08/21/64911.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Mon, 21 Aug 2006 15:44:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/08/21/64911.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/64911.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/08/21/64911.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/64911.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/64911.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#0000ff">
						<font color="#000000">     问题很简单，就是用Spring 管理struts的action。<br />      struts-config.xml如下：</font>
						<br />      &lt;struts-config&gt;</font>
		</p>
		<p>
				<font color="#0000ff">  &lt;data-sources /&gt;<br />  &lt;form-beans &gt;<br />    &lt;form-bean name="logonForm" type="com.xcblcx.struts.form.LogonForm"&gt;<br />    &lt;!-- &lt;form-property name="userName" type="java.lang.String"/&gt;<br />    &lt;form-property name="password" type="java.lang.String"/&gt; --&gt;<br />    &lt;/form-bean&gt;</font>
		</p>
		<p>
				<font color="#0000ff">  &lt;/form-beans&gt;</font>
		</p>
		<p>
				<font color="#0000ff">  &lt;global-exceptions /&gt;<br />  &lt;global-forwards /&gt;<br />  &lt;action-mappings &gt;<br />    &lt;action<br />      attribute="logonForm"<br />      input="/form/logon.jsp"<br />      name="logonForm"<br />      path="/Logon"<br />      scope="request"<br />      type="org.springframework.web.struts.DelegatingActionProxy"&gt;<br />      &lt;forward name="logon_sc" path="/success.jsp" /&gt;<br />    &lt;/action&gt;</font>
		</p>
		<p>
				<font color="#0000ff">  &lt;/action-mappings&gt;</font>
		</p>
		<p>
				<font color="#0000ff">  &lt;message-resources parameter="com.xcblcx.struts.ApplicationResources" /&gt;<br />  <br />  &lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br /> &lt;set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /&gt;<br />&lt;/plug-in&gt;<br />&lt;/struts-config&gt;<br /><br /><font color="#000000">spring的配置文件：（相关片段）</font><br />&lt;beans&gt;<br />         ........<br />       &lt;bean name="/Logon" class="com.xcblcx.struts.action.LogonAction"&gt;<br />              &lt;property name="CSCEDAO"&gt;<br />                  &lt;ref bean="programmerDAOImpl"/&gt;<br />              &lt;/property&gt;<br />      &lt;/bean&gt;<br /> &lt;/bean&gt;<br />&lt;/beans&gt;<br /><br />注入到action中的programmerDAOImpl没有问题，我已经使用普通应用程序测试过了。<br />现在问题是，运行logon.jsp点击提交后，tomcat报错：<br /></font>
		</p>
		<p>
				<b>
						<font style="BACKGROUND-COLOR: #525d76" color="#ffffff">type</font>
				</b> Status report</p>
		<p>
				<b>
						<font style="BACKGROUND-COLOR: #525d76" color="#ffffff">message</font>
				</b>
				<u>Servlet LogonAction is not available</u>
		</p>
		<p>
				<b>
						<font style="BACKGROUND-COLOR: #525d76" color="#ffffff">description</font>
				</b>
				<u>The requested resource (Servlet LogonAction is not available) is not available.<br /><br /></u>不知道为什么， 还请大家发表意见！<br />附带问一个问题，关于spring管理action的问题：一种是在Struts的Action中直接调用Spring的Bean；另一种方式是将Struts的Action作为Spring Beans，直接注入所需资源，由Spring进行管理。那种方法更好一点呢？</p>
<img src ="http://www.blogjava.net/xuechen0721/aggbug/64911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-08-21 23:44 <a href="http://www.blogjava.net/xuechen0721/archive/2006/08/21/64911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate3.0 + mysql5.0 error</title><link>http://www.blogjava.net/xuechen0721/archive/2006/08/20/64596.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Sun, 20 Aug 2006 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/08/20/64596.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/64596.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/08/20/64596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/64596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/64596.html</trackback:ping><description><![CDATA[      最近搭了一个开发环境如下: myeclipse5.0(eclipse3.2) + spring + hibernate3.0 + mysql5.0<br />      本想应该很顺利，因为我在办公室的机子上配置了类似的环境，只是用的是DB2 的数据库。可是在调试时尝试用hibernate连接数据库时，报了这样一个exception: java.sql.BatchUpdateException，没见过类似的，折腾了我两天啊，不知道是为什么，过程很曲折啊！<br />      一开始，我认为数据库连接不会有什么问题。所以我直接建了个web程序，在struts action中注入hibernate session，并用spring管理action，报错是肯定的，只是记不大清报的是什么错了。后来我就逐层剥离，将web层去掉，直接写客户端调用hibernate，还是报错。紧接着我又把spring去掉，不用spring来管理我的bean，单纯的使用hibernate，报了一个上面的exception: java.sql.BatchUpdateException。此时我就不知道该怎么办了，和办公室的环境做对比（从hibernate 配置文件到程序），都没有发现什么问题！折腾了两天，真够郁闷的。<br />      最后只能上网搜索，看到网友一片文章，他出了一个类似的问题，说是mysql5.0和hibernate3.0在字符编码上有问题，用4.1的mysql就没有问题。我就下了一个4.1的mysql试了一下果然就OK了。<br />      看来hibernate3.0不支持mysql5.0（或是网友说的字符编码问题，我不懂）。<br />      附带一个心得：再用eclipse从数据库生成映射文件时，会自动加上一个catolog= “你的数据源名”，要把它去掉，不然会报错！<br />      一点拙见，大家共享！<img src ="http://www.blogjava.net/xuechen0721/aggbug/64596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-08-20 11:45 <a href="http://www.blogjava.net/xuechen0721/archive/2006/08/20/64596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Spring中Log文件的位置问题！</title><link>http://www.blogjava.net/xuechen0721/archive/2006/08/06/62065.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Sun, 06 Aug 2006 10:59:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/08/06/62065.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/62065.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/08/06/62065.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/62065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/62065.html</trackback:ping><description><![CDATA[      前几天初步使用了一下Spring和Hibernate，简单的JAVA程序从数据库中读取一些数据而已。功能本身实现没有什么问题。运行后，一切正常，可console 打出一段红字很扎眼：说我没有配置log文件，看来Spring强烈要求配置啊！<br />      好，那我就写了个log4j.properties配置文件放在project根目录下，再次运行，一切正常，log文件中也打出了信息。可我突然不想把log文件放在根目录下，我单独建了一个包，想放在这个包里面。可不知道在Spring中怎么指定这个路径。看了几个project下的配置文件，都不知道怎么设置！<br />      我这个不是web project，纯粹的JAVA，怎么指定我的log路径，请各位指点！<img src ="http://www.blogjava.net/xuechen0721/aggbug/62065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-08-06 18:59 <a href="http://www.blogjava.net/xuechen0721/archive/2006/08/06/62065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>