springmvc4.3.7和hibernate5.2.8整合遇到的问题,求各路大神求解

ddl13876307544 2017-03-12 12:44:40
hibernate中的session能创建,数据库连接也没有问题,但是使用template调用方法,老是报java.lang.UnsupportedOperationException: Not supported by BasicDataSource异常,到底怎么回事啊?弄了一整天,实在找不出来。

junit报的异常:
java.lang.UnsupportedOperationException: Not supported by BasicDataSource
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:899)
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:99)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:129)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:47)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:146)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:148)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1940)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1909)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1887)
at org.hibernate.loader.Loader.doQuery(Loader.java:932)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
at org.hibernate.loader.Loader.doList(Loader.java:2615)
at org.hibernate.loader.Loader.doList(Loader.java:2598)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430)
at org.hibernate.loader.Loader.list(Loader.java:2425)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:370)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1481)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1441)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1410)
at org.springframework.orm.hibernate5.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:899)
at org.springframework.orm.hibernate5.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:887)
at org.springframework.orm.hibernate5.HibernateTemplate.doExecute(HibernateTemplate.java:359)
at org.springframework.orm.hibernate5.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:326)
at org.springframework.orm.hibernate5.HibernateTemplate.find(HibernateTemplate.java:887)
at cn.ddl.daoimpl.StudentDaoImpl.findAll(StudentDaoImpl.java:22)
at cn.ddl.test.Demo.demo2(Demo.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

这是我Spring和hibernate的配置:
<!-- 使用第三方JDBC配置 -->
<bean id="jdbc" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</bean>

<!-- 配置hibernate -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 引用第三方JDBC -->
<property name="dataSource" ref="jdbc"/>
<!-- 配置hibernate参数 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_Sql">true</prop>
</props>
</property>
<!-- 扫描映射类 -->
<property name="packagesToScan">
<list>
<value>cn.ddl.entity</value>
</list>
</property>
</bean>

<!-- 将template给dao层使用 -->
<bean id="template" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- 配置spring -->
<!-- 配置handlermapping -->
<mvc:annotation-driven/>
<!-- 扫描各个层 -->
<context:component-scan base-package="cn.ddl"/>
<!-- 配置ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>

<!-- 声明式事务 -->
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 开启事务 -->
<tx:annotation-driven transaction-manager="txManager"/>

这是我测试的代码:
package cn.ddl.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbcp.BasicDataSource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.ddl.daoimpl.StudentDaoImpl;
import cn.ddl.entity.Student;

public class Demo {

//测试session
@Test
public void demo1(){
String conf = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
SessionFactory sf = ac.getBean("sessionFactory", SessionFactory.class);
Session session = sf.openSession();
System.out.println(session);
Student s = session.get(Student.class, 1001);
System.out.println(s);
}

//测试连接数据库
@Test
public void demo2() throws SQLException{
List<Student> list = new ArrayList<Student>();
String conf = "applicationContext.xml";
String sql = "select * from stu";
ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
BasicDataSource bds = ac.getBean("jdbc",BasicDataSource.class);
Connection conn = bds.getConnection();
PreparedStatement pst = conn.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
if(rs.next()){
Student s = new Student();
s.setSid(rs.getInt("sid"));
s.setName(rs.getString("name"));
s.setSex(rs.getString("sex"));
list.add(s);
}
for(Student s : list){

System.out.println(s);
}
}

@Test
public void demo3(){
String conf = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
StudentDaoImpl sdi = ac.getBean("studentDaoImpl",StudentDaoImpl.class);
List<Student> list = sdi.findAll();
for(Student s : list){
System.out.println(s);
}
}

@Test
public void demo4(){
String conf = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
StudentDaoImpl sdi = ac.getBean("studentDaoImpl",StudentDaoImpl.class);
Student s = sdi.findStudent(1003);
System.out.println(s);
}


}
其中demo3和demo4都报的java.lang.UnsupportedOperationException: Not supported by BasicDataSource异常
...全文
182 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ddl13876307544 2017-03-13
  • 打赏
  • 举报
回复
问题找到了 源码如下: public Connection getConnection(String username, String password) throws SQLException { // This method isn't supported by the PoolingDataSource returned by // the createDataSource throw new UnsupportedOperationException("Not supported by BasicDataSource"); // return createDataSource().getConnection(username, password); } BasicDataSource默认调用是这个 public Connection getConnection(String username, String password)方法 我解决的方法是重写public Connection getConnection(String username, String password)方法让其调用public Connection getConnection() 这是我的代码: package cn.ddl.test; import java.sql.Connection; import java.sql.SQLException; import org.apache.commons.dbcp.BasicDataSource; public class MyBasicDataSource extends BasicDataSource{ @Override public Connection getConnection(String username, String password) throws SQLException { return createDataSource().getConnection(); } }
ddl13876307544 2017-03-12
  • 打赏
  • 举报
回复
我的是springMVC+hibernate的注解方式
ddl13876307544 2017-03-12
  • 打赏
  • 举报
回复
这异常具体原因是什么?是少了hibernate的配置吗?
BUG胡汉三 2017-03-12
  • 打赏
  • 举报
回复

<bean id="sessionFactory"
		class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
				<!-- SQL Server的Dialect方言配置 -->
				<!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2012Dialect</prop> -->
				<!-- Oracle的Dialect方言配置 -->
				<!-- <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> -->
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.use_outer_join">true</prop>
				<prop key="hibernate.jdbc.fetch_size">30</prop>
				<prop key="hibernate.jdbc.batch_size">30</prop>
				<prop key="hibernate.jdbc.batch_versioned_data">true</prop>
				<prop key="hibernate.cache.use_second_level_cache">true</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
				<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider
				</prop>
				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
				</prop>
				<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext
				</prop>
				<!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
				<prop key="javax.persistence.validation.mode">none</prop>
				<!-- hibernate.id.new_generator_mappings参数设置:MySQL和SQL Server为false,Oracle为true -->
				<prop key="hibernate.id.new_generator_mappings">false</prop>
			</props>
		</property>
		<property name="dataSource" ref="dataSource" />
		<property name="packagesToScan">
			<list>
				<value>com.yfkj.wms.model</value>
			</list>
		</property>
	</bean>

81,087

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧