webservice开发:Myeclipse里整合asix2和hibernate,并同时连sql server 2008 和 oracle 11g个人总结

来源:互联网 发布:淘宝如何上传宝贝图片 编辑:程序博客网 时间:2024/06/08 13:30

这里有好几个恶心的地方:

1.首先,如果用sql server 2008 的话 ,最好不要使用microsoft提供的驱动,传说microsoft的驱动有bug,不能跟hibernate兼容,会报一个java.lang.AbstractMethodError: com.microsoft.jdbc.base.BaseDatabaseMetaData.supportsGetGeneratedKeys()Z的错误


解决:

需要换一种驱动连接,使用jtds(下载地址:http://sourceforge.net/projects/jtds/files/)下载jtds1.2版(文件名:jtds-1.2-dist),解压得到jtds-1.2.jar,引用到eclipse中项目目录下(去除原驱动引用),更改hibernate配置文件:

原驱动连接配置:

 <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
        <property name="connection.url">jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=hibernate</property>
更改jtds连接:  
        <property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
        <property name="connection.url">jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=hibernate</property>

补充:java代码调原驱动连接数据库是没有问题的,搭配hibernate会有此问题。

补充:开始的时候jtds的jar包下载了1.3版本的,在配置DB Browser的时候 检测不到driver class,后改为1.2版本才行。


参考:http://blog.csdn.net/goustzhu/article/details/5916566



2.hibernate同时连2个数据库的方法,和可能会碰到的问题

右键项目--myeclipse--add hibernate Capabilities先添加一个oracle的连接

注意:由于oracle 11g没有专用的dialect  所以选择通用版本最好


完了得到这样两个文件

然后右键项目--new--other


先选上面的生成第二份配置文件,选择sqlserver的连接(jtds驱动的),之后再new一份session Factory



3.配置好了,开始调试


oracle和sql server分别反向生成实体类,



HbnUtil.java



package services;

import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.hibernate.cfg.Configuration;  
 
public class HbnUtil {// 根据hibernate.cfg.xml创建一个静态sessionFactory  
 
private static SessionFactory orcf;  
private static SessionFactory MSsf;  
static {  
    orcf = new Configuration().configure("hibernate_oracle.cfg.xml").buildSessionFactory();  
    MSsf = new Configuration().configure("hibernate_sqlserver.cfg.xml").buildSessionFactory();  
}  
 
/**根据DBName判断调用哪个sessionFactory的openSession()方法*/  
public static Session getSessionByDB(String DBName) {  
    
    
    
   Session s = null;  
 
   if (DBName == "oracle") {  
    if (!orcf.isClosed())  
     s = orcf.openSession();  
   } else if (DBName == "sqlserver") {  
    if (!MSsf.isClosed())  
     s = MSsf.openSession();  
   } else {  
    System.out.println("错误的 DBName!");  
   }  
   return s;  
}  
/**根据DBName判断调用哪个sessionFactory的close()方法*/  
public static void closeSessionFactoryByDB(String DBName) {  
   if (DBName == "oracle") {  
    if (!orcf.isClosed()) {  
        orcf.close();  
    }  
   } else if (DBName == "sqlserver") {  
    if (!MSsf.isClosed()) {  
        MSsf.close();  
    }  
   } else {  
    System.out.println("错误的 DBName!");  
   }  
}  
}  










Test.java



public static String oraAndMssql(){
        //获取sqlserver和oracle的session
        Session sqlSession = HbnUtil.getSessionByDB("sqlserver");  
        Session oracleSession = HbnUtil.getSessionByDB("oracle");
        String result = "";
        try{
            String sql1 = " from CBill";  
            Query query1 = sqlSession.createQuery(sql1);   
            List<CBill> cbList = query1.list();
            CBill cbill  =  cbList.get(0);
            
            
            String sql2 = " from BusCourses";
            Query query2 = oracleSession.createQuery(sql2);   
            List<BusCourses> busList = query2.list();
            BusCourses busC= busList.get(0);
            
            result+="{";
            result=result+"[\"Billcode\":\""+cbill.getBillcode()+"\",\"CreateBy\":\""+busC.getCreateBy()+"\"]";
            result+="}";
        }catch(HibernateException e) {
            e.printStackTrace();
        }finally{
            sqlSession.close();  
            oracleSession.close();  
            HbnUtil.closeSessionFactoryByDB("sqlserver");
            HbnUtil.closeSessionFactoryByDB("oracle");
        }
        
        return result;
    }


4.通过axis2发布成webservice

http://wenku.baidu.com/view/6eae036d011ca300a6c390a4.html

先学习下axis2使用教程



学完之后。右键项目--new--other 


---next---


--next---


--next--


这里需要提一下,axis2发布的时候,这里需要把数据库驱动包 hibernate核心包全部加进来

--next--


这里也需要注意一下,有个bug,后面再提到,先打勾。--next---


--next--


然后finish,


弹出这样的就发布成功了



注意:之前说的bug还没解决,整个webservice还有问题。

找到路劲D:\Program Files (x86)\tomcat\apache-tomcat-6.0.29\apache-tomcat-6.0.29\webapps\axis2\WEB-INF\services


打开--META-INF---services.xml


<service name="MyService" >
    <description>
        Please Type your service description here
    </description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
        <messageReceiver  mep="http://www.w3.org/2004/08/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass">services.TestService</parameter>

<parameter name="ServiceTCCL">composite</parameter>
</service>

增加红色那行代码

推荐:此时推荐把修改过的services.xml拷出来,并且再次发布时直接选择文件,不然每次都要手动修改services.xml



然后就可以通过访问这个webservice操作2个数据库了






















原创粉丝点击