这里有好几个恶心的地方:
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个数据库了