Java SimpleJdbcInsert无法找到表';用户模型';因此insert语句可以';不能生成

Java SimpleJdbcInsert无法找到表';用户模型';因此insert语句可以';不能生成,java,spring,jdbc,transactions,spring-jdbc,Java,Spring,Jdbc,Transactions,Spring Jdbc,我得到了这个错误 Unable to locate columns for table 'user_models' so an insert statement can't be generated 使用弹簧3.1.2。我正在维护一个遗留代码。它(引发异常的方法)具有注释@Transactional(propagation=propagation.REQUIRED)。此外,它还使用缓存,并具有以下注释@cacheexecute(value=“UserModel”,key=“#UserModel

我得到了这个错误

Unable to locate columns for table 'user_models' so an insert statement can't be generated
使用弹簧3.1.2。我正在维护一个遗留代码。它(引发异常的方法)具有注释
@Transactional(propagation=propagation.REQUIRED)
。此外,它还使用缓存,并具有以下注释
@cacheexecute(value=“UserModel”,key=“#UserModel.id”)
我遇到了这个异常的死胡同。我只找到了一个关于此错误的链接: 我想不出有什么道理。至少有人能给我指引正确的方向吗

编辑

堆栈跟踪如下:

Server Error occured while executing method [saveModel] org.springframework.dao.InvalidDataAccessApiUsageException: Unable to locate columns for table 'user_models' so an insert statement can't be generated
        at org.springframework.jdbc.core.metadata.TableMetaDataContext.createInsertString(TableMetaDataContext.java:325)
        at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compileInternal(AbstractJdbcInsert.java:282)
        at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compile(AbstractJdbcInsert.java:265)
        at org.springframework.jdbc.core.simple.AbstractJdbcInsert.checkCompiled(AbstractJdbcInsert.java:316)
        at org.springframework.jdbc.core.simple.AbstractJdbcInsert.doExecute(AbstractJdbcInsert.java:342)
        at org.springframework.jdbc.core.simple.SimpleJdbcInsert.execute(SimpleJdbcInsert.java:114)
        at com.capillary.recommender.model.user.data.dao.impl.UserModelDaoImpl.save(UserModelDaoImpl.java:344)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
        at com.capillary.common.spring.transaction.ProxyTransactionInterceptor.invoke(ProxyTransactionInterceptor.java:30)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.cache.interceptor.CacheInterceptor$1.invoke(CacheInterceptor.java:58)
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:213)
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:66)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
        at com.sun.proxy.$Proxy67.save(Unknown Source)
        at com.capillary.recommender.model.user.UserModelStore.saveModel(UserModelStore.java:62)
        at com.capillary.recommender.model.user.UserModelStore.saveModel(UserModelStore.java:19)
        at com.capillary.recommender.thrift.ThriftRecommenderService.saveModel(ThriftRecommenderService.java:168)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
引发以下错误的代码段:

Map<String, Object> args = ImmutableMap.<String, Object>builder()
                .put(ID_COL, modelId)
                .put(ORG_ID_COL, orgId)
                .put(NAME_COL, name)
                .put(SCORES_TABLE_NAME_COL, scoresTableName)
                .put(TARGET_TABLE_NAME_COL, targetTableName)
                .put(ATTRIB_JSON_COL, attributes)
                .build();

        if (insert) {
            insert().withTableName(TABLE).execute(args);
            userModel.setId(modelId);
Map args=ImmutableMap.builder()
.put(ID\u COL,modelId)
.put(组织标识栏,组织标识栏)
.put(名称、颜色、名称)
.put(分数\表格\名称\列,分数稳定名称)
.put(目标表格名称列,目标表格名称)
.put(属性、属性)
.build();
如果(插入){
insert().withTableName(TABLE).execute(args);
setId(modelId);
上面是DaoImpl。TABLE的值在Dao上面的层中声明为

公共静态最终字符串表=“用户\模型”


我曾经犯过同样的错误。问题是表名输入错误。请仔细检查您是否正确输入了表名。

我们也有同样的错误

我们的“tableName”是另一个模式中的表的同义词

但是关于 默认情况下,Oracle连接配置为“includesynoyms”=false

请尝试以下方法解决此问题:

new SimpleJdbcInsert(datasource)
.includeSynonymsForTableColumnMetaData()
.withTableName("tableName");
此外,我们还有pooledConnections,因此为了处理此问题,我们必须指定本机jdbc提取器:

new SimpleJdbcInsert(datasource)
.useNativeJdbcExtractorForNetaData(new OracleJdbc4NativeJdbcExtractor())
.includeSynonymsForTableColumnMetaData()
.withTableName("tableName");

您可以尝试更改mysql connector/j的版本,该版本不能为6.0.x,5.1.45也可以

除了表名之外,您还需要指定列:

String[] columns = {"column1","column2"}

SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(dataSource)
                .usingColumns(columns)
                .withTableName(table);

如果使用postgresql数据库,则需要将表名放在引号之间:

withTableName("\"my_table_name\"")

您能为我们提供此异常的stacktrace吗?此异常意味着SimpleJdbcInsert无法查找您试图插入的表的元数据。您可以提供以编程方式使用的列,而不依赖JDBC元数据。您能发布一些代码和stacktrace吗?不要在此处添加注释