【问题标题】:SimpleJdbcInsert Unable to locate columns for table 'user_models' so an insert statement can't be generatedSimpleJdbcInsert 无法找到表“user_models”的列,因此无法生成插入语句
【发布时间】:2015-01-19 14:32:02
【问题描述】:

我收到了这个错误

Unable to locate columns for table 'user_models' so an insert statement can't be generated

使用 Spring 3.1.2。我正在维护旧代码。它(抛出异常的方法)有注解@Transactional(propagation = Propagation.REQUIRED)。它还使用缓存并具有以下注释@CacheEvict(value = "UserModel", key = "#userModel.id") 我在这个异常上遇到了死胡同。我只找到了一个关于此错误的链接: https://jira.spring.io/browse/SPR-4782 我无法理解它。至少有人可以指导我正确的方向。

编辑

下面的堆栈跟踪:

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)

sn-p 抛出以下错误:

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);

以上就是 DaoImpl。 TABLE 的值在 Dao 的上一层声明为

public static final String TABLE = "user_models";

【问题讨论】:

  • 能否为我们提供此异常的堆栈跟踪信息?
  • 异常意味着 SimpleJdbcInsert 无法查找您尝试插入的表的元数据。您可以提供以编程方式使用的列,而不依赖于 JDBC 元数据。你能发布一些代码和堆栈跟踪吗?

标签: java spring jdbc transactions spring-jdbc


【解决方案1】:

我曾经遇到过同样的错误。问题原来是表名上的拼写错误。仔细检查您是否输入了正确的表名。

【讨论】:

    【解决方案2】:

    我们遇到了同样的错误。

    我们的“tableName”是另一个架构中的表的同义词。

    但是关于https://jira.spring.io/browse/SPR-4782 Oracle Connection 默认配置为 "includeSynonyms" = false。

    试试这个来解决这个问题:

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

    我们还有 pooledConnections ,所以为了处理这个问题,我们必须指定本地 jdbc 提取器:

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

    【讨论】:

      【解决方案3】:

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

      String[] columns = {"column1","column2"}
      
      SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(dataSource)
                      .usingColumns(columns)
                      .withTableName(table);
      

      【讨论】:

        【解决方案4】:

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

        withTableName("\"my_table_name\"")
        

        【讨论】:

          【解决方案5】:

          你可以尝试改变mysql connector/j的版本,不能是6.0.x和5.1.45就可以了

          【讨论】:

          • 不要在此处添加 cmets
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-15
          • 1970-01-01
          • 2014-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多