换不同的数据库,应该只改变datasource和映射文件就可以了的,

解决方案 »

  1.   

    应该是方言了另外MYSQL的ORACLE对二进制的操作也不同的,这点要注意
      

  2.   

    不清楚吗?就是想实现切换数据库的功能,我只想改配置就可以实现切换不同的数据库功能,
    2楼说的部分对,我也这样实现了,只不过ORACLE的CLOB的字段实在特别,与MYSQL的LONGTEXT实现方法不用,所以server类有些不同的,一般的基本都不用改,只改数据库链接就可以了。我现在是有两个服务类oracle的com.eweb.business.ArticleService,MYSQL的com.eweb.business.ArticleSQLService现在纳闷的是为什么我在applicationContext.xml切换到ArticleSQLService服务类时却出错,即使
    和ArticleService类的内容是一样的。难道SPRING的配置跟名字有些关系??错误com.eweb.util.BaseAction.getArticleService(BaseAction.java:37) 
    调用的就是:AppContext.getInstance().getAppContext().getBean("articleService"); oracle applicationContext.xml 配置    <bean   id="articleService"   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"   > 
            <property   name="transactionManager"> 
                <ref   local="transactionManager"/> 
            </property> 
            <property   name="target"> 
                <ref   local="articleTarget"/> 
            </property> 
            <property   name="transactionAttributes"> 
                <props> 
                    <prop   key="*"> PROPAGATION_REQUIRED </prop> 
                </props> 
            </property> 
            <property   name="proxyTargetClass"> 
                <value> true </value>   
            </property> 
      </bean>
      <bean id="articleTarget" class="com.eweb.business.ArticleService" singleton="true">
       <property name="articleDAO">
       <ref local="articleDAO" />
       </property>
      </bean>
      <bean id="articleDAO" class="com.eweb.dao.ArticleDAO">
        <property name="sessionFactory">
          <ref local="sessionFactory"/>
        </property>  
      </bean> mysql applicationContext.xml 配置    <bean   id="articleService"   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"   > 
            <property   name="transactionManager"> 
                <ref   local="transactionManager"/> 
            </property> 
            <property   name="target"> 
                <ref   local="articleTarget"/> 
            </property> 
            <property   name="transactionAttributes"> 
                <props> 
                    <prop   key="*"> PROPAGATION_REQUIRED </prop> 
                </props> 
            </property> 
            <property   name="proxyTargetClass"> 
                <value> true </value>   
            </property> 
      </bean>
      <bean id="articleTarget" class="com.eweb.business.ArticleSQLService" singleton="true">
       <property name="articleDAO">
       <ref local="articleDAO" />
       </property>
      </bean>
      <bean id="articleDAO" class="com.eweb.dao.ArticlesqlDAO">
        <property name="sessionFactory">
          <ref local="sessionFactory"/>
        </property>  
      </bean>为何单切换MYSQL server类就出错,大家注意到DAO原理是一样的,切换了都正常的。dao接口类
    public interface IArticleDAO { public void save(Article transientInstance);

    public void update(Article transientInstance);
    }
    ArticleDAO类(oracle)
    public class ArticleDAO extends HibernateDaoSupport implements IArticleDAO{public void save(Article transientInstance) {
    log.debug("saving Article instance");
    try {
    //CLOB clob = (CLOB)transientInstance.getContent();
    Session session = this.getSession();
    transientInstance.setContent(Hibernate.createClob(" "));
    session.save(transientInstance);
    session.flush();
    session.refresh(transientInstance, LockMode.UPGRADE);
    CLOB clob = (oracle.sql.CLOB)((org.hibernate.lob.SerializableClob)transientInstance.getContent()).getWrappedClob();
    clob.putString(1, transientInstance.getContentString());
    //this.getHibernateTemplate().save(transientInstance);
    log.debug("save successful");
    } catch (Exception re) {
    log.error("save failed", re);
    re.printStackTrace();
    //throw re;
    }
    }
    }ArticlesqlDAO类(mysql)public class ArticlesqlDAO extends HibernateDaoSupport implements IArticleDAO{ public void save(Article transientInstance) {
    log.debug("saving Article instance");
    try {
    this.getHibernateTemplate().save(transientInstance);
    log.debug("save successful");
    } catch (Exception re) {
    log.error("save failed", re);
    re.printStackTrace();
    //throw re;
    }
    }
     
    }service接口类
    public interface IArticleService { public List findByPage(Pager pager, Long catalogId);

    public Long findByPageCount(Long catalogId);

    public void save(Article article);
    }ArticleService (orcale)
    public class ArticleService implements IArticleService{
    private IArticleDAO articleDAO; public IArticleDAO getArticleDAO() {
    return articleDAO;
    }
            public void save(Article article) {
    this.getArticleDAO().save(article);
    }
    public Article findByTitleCatalog(String title,Long catalogId){
    List list = this.getArticleDAO().findByTitleCatalog(title, catalogId);
    if(list.size()>0)
    {
    Article article = (Article)list.get(0);
    String content = "";
    try {

    if(article.getContent()!=null)
    {
    System.out.print("content :" + article.getContent().getSubString(1, (int)article.getContent().length()));
    content = article.getContent().getSubString(1, (int)article.getContent().length());
    article.setContentString(content);
    }
    else
    {
    article.setContentString("");
    System.out.print("content :null");
    }
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return article;
    }
    else
    {
    return null;
    }
    }
    }
    ArticleSQLService (mysql)
    public class ArticleSQLService implements IArticleService {
    private IArticleDAO articleDAO;

    public ArticleSQLService() {
    super();
    } public IArticleDAO getArticleDAO() {
    return articleDAO;
    }
            public void save(Article article) {
    this.getArticleDAO().save(article);
    }
            public Article findByTitleCatalog(String title,Long catalogId){
    List list = this.getArticleDAO().findByTitleCatalog(title, catalogId);
    if(list.size()>0)
    {
    Article article = (Article)list.get(0);
    return article;
    }
    else
    {
    return null;
    }
    }
    }就是ORACLE和mysql大字段实现不同,所以得切换service类和dao类。为什么dao类无论什么情况下都成功,而service类切换到MYSQL服务类时却出错了,如果换成ORACLE服务类,DAO还是使用MYSQL DAO类不会出错的。不知道大家看明白了没?
      

  3.   

    抛出的错误
    javax.servlet.ServletException: com.eweb.business.ArticleSQLService$$EnhancerByCGLIB$$be7a4243
    org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:516)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:423)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1158)
    com.eweb.util.MyActionServlet.process(MyActionServlet.java:12)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    root cause java.lang.ClassCastException: com.eweb.business.ArticleSQLService$$EnhancerByCGLIB$$be7a4243
    com.eweb.util.BaseAction.getArticleService(BaseAction.java:37)
    com.eweb.struts.action.ArticleAction.list(ArticleAction.java:101)
    com.eweb.struts.action.ArticleAction.execute(ArticleAction.java:49)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1158)
    com.eweb.util.MyActionServlet.process(MyActionServlet.java:12)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
      

  4.   

    (ArticleService)AppContext.getInstance().getAppContext().getBean("articleService"); 
    这里忘了改为接口,强行装换出错。