2014-11-24 19 views
1

我对这个社区不熟悉,不确定我是否在正确的位置发布......也在Oracle的OTN上发布了此信息。如何使用OracleDataTypeFactory配置oracle的Spring数据

我是甲骨文的老手,但对Spring Data有点新东西,他在postGIS上做了一些工作,但现在试图将它应用到Oracle。

我的问题:我有一个新的maven项目,实体和存储库类,以及一个使用DbUnit预加载测试数据的JUnit测试程序。

目前的配置使用的beans.xml文件来设置:

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">... 
    <property name="jpaProperties">.... 

<bean id="vendorAdapter" 
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
    <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" /> 
    <property name="generateDdl" value="false" /> 
</bean> 

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    destroy-method="close"> 
    <property name="driverClass" value="oracle.jdbc.OracleDriver" /> 
    <property name="jdbcUrl" 
    value="jdbc:oracle:thin:@localhost:2632:BLADE" />... 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
<property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

测试repos.count的()工作正常。

测试调用repos.findByName(String)失败,(堆栈在下面)。

现在,当前设置不处理SDO_GEOMETRY或TIMESTAMP(0),但会管理TIMESTAMP(6)。

下面的警告显示我使用的是“DefaultDataTypeFactory”,应该使用OracleDataTypeFactory。

我也找到了OracleDataSource类,并尝试过,但仍然得到相同的数据类型问题。

好了,大问题:

  1. 任何人都可以点我一个例子来配置数据源,或vendorAdapter,使用OracleDataTypeFactory,并检索这些数据类型?

  2. 什么数据类型应该在Java中用于几何列?

感谢,

菲尔

测试输出警告:

16:24:05.846 [main] INFO org.springframework.test.context.transaction.TransactionalTestExecutionListener - Began transaction (2) for test context [[email protected] testClass = NotamRepositoryTest, testInstance = com.thalesgro[email protected]3ff1d6, testMethod = [email protected], testException = [null], mergedContextConfiguration = [[email protected] testClass = NotamRepositoryTest, locations = '{classpath:testBeans.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]]; transaction manager [[email protected]]; rollback [true] 

16:24:08.674 [main] WARN org.dbunit.dataset.AbstractTableMetaData - Potential problem found: The configured data type factory 'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause problems with the current database 'Oracle' (e.g. some datatypes may not be supported properly). In rare cases you might see this message because the list of supported database products is incomplete (list=[derby]). If so please request a java-class update via the forums.If you are using your own IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override getValidDbProducts() to specify the supported database products. 

16:24:08.674 [main] WARN org.dbunit.util.SQLHelper - DATA_SET.SEC_TAG_MODIFIED data type (1111, 'TIMESTAMP(0)') not recognized and will be ignored. See FAQ for more information. 

16:24:08.674 [main] WARN org.dbunit.util.SQLHelper - DATA_SET.CREATED data type (1111, 'TIMESTAMP(0)') not recognized and will be ignored. See FAQ for more information. 

16:24:08.674 [main] WARN org.dbunit.util.SQLHelper - DATA_SET.MODIFIED data type (1111, 'TIMESTAMP(0)') not recognized and will be ignored. See FAQ for more information. 

16:24:08.690 [main] WARN org.dbunit.util.SQLHelper - DATA_SET.VALID_FROM data type (1111, 'TIMESTAMP(0)') not recognized and will be ignored. See FAQ for more information. 

16:24:08.690 [main] WARN org.dbunit.util.SQLHelper - DATA_SET.VALID_TO data type (1111, 'TIMESTAMP(0)') not recognized and will be ignored. See FAQ for more information. 

16:24:08.690 [main] WARN org.dbunit.dataset.AbstractTableMetaData - Potential problem found: The configured data type factory 'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause problems with the current database 'Oracle' (e.g. some datatypes may not be supported properly). In rare cases you might see this message because the list of supported database products is incomplete (list=[derby]). If so please request a java-class update via the forums.If you are using your own IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override getValidDbProducts() to specify the supported database products. 

16:24:08.690 [main] WARN org.dbunit.util.SQLHelper - NOTAM.Q_POINT data type (1111, 'SDO_GEOMETRY') not recognized and will be ignored. See FAQ for more information. 

16:24:08.690 [main] WARN org.dbunit.util.SQLHelper - NOTAM.Q_RANGE_RING data type (1111, 'SDO_GEOMETRY') not recognized and will be ignored. See FAQ for more information. 


    **java.lang.UnsupportedOperationException** 
at org.hibernate.spatial.GeometrySqlTypeDescriptor.getExtractor(GeometrySqlTypeDescriptor.java:57) 
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:267) 
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:263) 
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253) 
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:338) 
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2969) 
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1695) 
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1627) 
at org.hibernate.loader.Loader.getRow(Loader.java:1514) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:725) 
at org.hibernate.loader.Loader.processResultSet(Loader.java:952) 
at org.hibernate.loader.Loader.doQuery(Loader.java:920) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354) 
at org.hibernate.loader.Loader.doList(Loader.java:2553) 
at org.hibernate.loader.Loader.doList(Loader.java:2539) 
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369) 
at org.hibernate.loader.Loader.list(Loader.java:2364) 
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387) 
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231) 
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264) 
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103) 
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573) 
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449) 
at org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:67) 
at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:81) 
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:59) 
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:97) 
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:88) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:384) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:344) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:111) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
at com.sun.proxy.$Proxy67.findByDataSetNameAndDeletedIsNull(Unknown Source) 
at com.thalesgroup.uk.airscape.common.data.domain.dao.notam.NotamRepositoryTest.testNotamFetchByDatasetName(NotamRepositoryTest.java:103) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
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.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:233) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:87) 
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.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:176) 
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:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

回答

1

好了,我们终于想通了。这里有两个问题。

首先,UnsupportedOperationException是由于在实体中使用了错误的Java类。 对于Oracle SDO_GEOMETRY列,使用:

import oracle.spatial.geometry.JGeometry; 

@Column(name = "Q_POINT") 
private JGeometry qPoint; 

其次,从DBUnit的警告可以通过配置使用DBUnit使用正确类型的工厂来解决。 此处的示例使用beans.xml创建具有正确设置的bean,然后由dbunit使用它们:

<bean id="vendorAdapter" 
     class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="database" value="ORACLE" /> 
     <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" /> 
     <property name="generateDdl" value="false" /> 
    </bean> 

    <!-- Beans to support DBunit for unit testing with Oracle. --> 
    <bean id="dbUnitDatabaseConfig" class="com.github.springtestdbunit.bean.DatabaseConfigBean"> 
    <property name="datatypeFactory"> 
     <bean class="org.dbunit.ext.oracle.OracleDataTypeFactory"/> 
    </property> 
    </bean> 
    <bean id="dbUnitDatabaseConnection" class="com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean"> 
    <property name="databaseConfig" ref="dbUnitDatabaseConfig"/> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="schema" value="MAIN"/> 
    </bean> 

    <!-- Oracle connection pool --> 
    <bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" 
    destroy-method="close"> 
    <property name="connectionCachingEnabled" value="true" /> 
    <property name="URL"> 
     <value>jdbc:oracle:thin:@<dbhost>:<dbport>:<dbSID></value> 
    </property> 
    <property name="user"> 
     <value>myuser</value> 
    </property> 
    <property name="password"> 
     <value>mypwd</value> 
    </property> 
    <property name="connectionCacheProperties"> 
     <value> 
     MinLimit:1 
     MaxLimit:20 
     InitialLimit:1 
     ConnectionWaitTimeout:120 
     InactivityTimeout:180 
     ValidateConnection:true 
     </value> 
    </property> 
    </bean> 
相关问题