SimpleJdbcInsert Невозможно найти столбцы для таблицы 'user_models', поэтому оператор вставки не может быть создан

1

Я получаю эту ошибку

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") аннотацию @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)

Фрагмент, который выдает ошибку ниже:

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 объявляется в слое выше Дао как

public static final Строка TABLE = "user_models";

  • 0
    Можете ли вы предоставить нам трассировку стека для этого исключения?
  • 0
    Исключение означает, что SimpleJdbcInsert не смог найти метаданные для таблицы, в которую вы пытаетесь вставить. Вы можете предоставить столбцы для программного использования и не полагаться на метаданные JDBC. Не могли бы вы опубликовать код и трассировку стека?
Теги:
spring
jdbc
transactions
spring-jdbc

4 ответа

2

У нас была такая же ошибка.

Наше "tableName" было синонимом таблицы в другой схеме.

Но в отношении https://jira.spring.io/browse/SPR-4782 Oracle Connection настроен с помощью includeSynonyms = false по умолчанию.

Попробуйте это, чтобы исправить это:

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

Кроме того, у нас были объединенные соединения, поэтому, чтобы справиться с этим, нам пришлось указать встроенный экстрактор jdbc:

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

Однажды у меня была одна ошибка. Проблема оказалась опечаткой по имени таблицы. Дважды проверьте, правильно ли вы набрали имя таблицы.

0

Кроме имени таблицы, вам также необходимо указать столбцы:

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

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

u может попытаться изменить версию mysql connector/j, которая не может быть 6.0.x и 5.1.45 в порядке

  • 0
    Не добавляйте комментарии здесь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню