Более чем одна таблица найдена в пространстве имен (,) - SchemaExtractionException

Я столкнулся с этим странным исключением, пытаясь сохранить некоторые значения в таблице, используя Hibernate в Java-приложении. Однако это исключение встречается только для одной конкретной таблицы/сущности для остальной части таблиц. Я могу выполнять crud-операции через Hibernate.

Пожалуйста, найдите ниже Stacktrace и дайте мне знать, если это так или иначе связано с Java-кодом или его ошибкой дизайна базы данных.

 2016-04-28 11:52:34 ERROR XXXXXDao:44 - Failed to create sessionFactory object.org.hibernate.tool.schema.extract.spi.SchemaExtractionException: More than one table found in namespace (, ) : YYYYYYY
Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.XX.dao.XXXXXXXDao.main(XXXXXXXXDao.java:45)
Caused by: org.hibernate.tool.schema.extract.spi.SchemaExtractionException: More than one table found in namespace (, ) : YYYYYYY
    at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults(InformationExtractorJdbcDatabaseMetaDataImpl.java:381)
    at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.getTable(InformationExtractorJdbcDatabaseMetaDataImpl.java:279)
    at org.hibernate.tool.schema.internal.exec.ImprovedDatabaseInformationImpl.getTableInformation(ImprovedDatabaseInformationImpl.java:109)
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.performMigration(SchemaMigratorImpl.java:252)
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:137)
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:110)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:176)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:64)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:458)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
    at com.xx.dao.zzzzzzzzzzzzDAOFactory.configureSessionFactory(zzzzzzzDAOFactory.java:43)
    at com.xx.dao.zzzzzzzzzzzzDAOFactory.buildSessionFactory(zzzzzzzzzDAOFactory.java:27)
    at com.xx.dao.XXXXXXXXDao.main(XXXXXXXXDao.java:41)

Заранее благодарим за помощь

Ответ 1

У меня была такая же проблема, и я смог найти код, чтобы узнать причину, по крайней мере, в моем случае. Я не знаю, будет ли это для вас той же проблемой, но это может быть полезно.

Из трассировки стека я вижу, что у вас установлен hibernate.hbm2ddl.auto для обновления схемы. Как часть этого, он пытается найти метаданные для всех таблиц, о которых знает hibernate, и для одного из них возникает двусмысленный ответ, потому что запрос метаданных возвращает больше, чем одна строка таблицы или метаданных представления.

В моем случае это было вызвано нашим соглашением об именах для таблиц. У нас был стол, называемый (скажем) "AAA_BBB", для которого это происходило неправильно. Теперь использование подчеркивания в названии таблицы вполне приемлемо, насколько мне известно, и является довольно распространенной практикой. Однако подчеркивание также является подстановочным символом SQL для одного символа; глядя в код метаданных базы данных, я вижу, что он делает "WHERE table_name LIKE..." в методе DatabaseMetaData.getTables(...), который используется здесь для спящего режима.

Теперь в моей схеме у меня также была вторая таблица под названием "AAA1BBB", и поэтому оба они соответствовали поиску метаданных, и поэтому она возвращала строку метаданных для каждой из этих таблиц. Метод hibernate записывается так, чтобы просто упасть, если результат, полученный из поиска метаданных таблицы, возвращает более одной строки. Я предполагаю, что он должен исследовать доступные строки и найти, если есть то, что является точным совпадением с указанным именем таблицы.

Я тестировал это как для Oracle, так и для MySQL с тем же результатом.

Ответ 2

Кажется, что свойство hibernate.hbm2ddl.auto, установленное для обновления, вызывает проблему здесь. Попробуйте удалить его из xibernate config xml.

Ответ 3

Это будет работать:

Проверьте схему вашей базы данных и привилегии пользователя базы данных;

Механизм обновления Hibernate может выйти из строя с этим исключением, если есть другая схема/пользователь базы данных с тем же именем таблицы, и пользователь db имеет достаточные привилегии для просмотра этой таблицы.

Итак, в вашем случае таблица "YYYYYYY" может быть найдена в нескольких пользователях/схемах базы данных, а ваш пользователь db имеет привилегии "DBA".

Чтобы решить эту проблему, вы можете найти или удалить неоднозначную таблицу или удалить пользовательские избыточные привилегии.

Ответ 4

Другая ситуация может возникнуть, за исключением того, что был указан какой-либо дорогой RichB. в ORACLE каждый пользователь имеет отдельную схему, Поэтому, вероятно, есть буксировочные столы с одинаковым именем в двух разных схемах то вы должны указать свою схему по умолчанию в файле persistence.xml со значением ниже

<property name="hibernate.default_schema" value="username"/>

Ответ 5

Использовать значение каталога с помощью @Table, то есть:

@Entity
@Table(**catalog = "MY_DB_USER"**, name = "LOOKUP")
public class Lookup implements Serializable {

}

У меня сейчас нет этой ошибки. Надеюсь на эту работу.

Ответ 6

У нас было приложение Spring Data/JPA, и эта ошибка стала возникать после обновления до Postgres 10.6 (из 10).

Наше решение было следующим в классе конфигурации JPA: обратите внимание на новую закомментированную строку,

props.put("hibernate.hbm2ddl.auto", "none");//POSTGRES 10 --> 10.6 migration

Учебный класс:

@Configuration
@EnableJpaRepositories(basePackages = "app.dao")
@ComponentScan(basePackages = { "app.service" })
@EnableTransactionManagement
public class JpaConfig {

    @Autowired
    DataSource dataSource;

    @Bean
    public Map<String, Object> jpaProperties() {
        Map<String, Object> props = new HashMap<String, Object>();
        props.put("hibernate.dialect", PostgreSQL95Dialect.class.getName());
        props.put("hibernate.hbm2ddl.auto", "none"); //POSTGRES 10 --> 10.6 migration.
        return props;
    }

Ответ 7

У меня такая же проблема с такой конфигурацией

@Entity
@Table(name = "NOTIFICATION")
public class Notification {
    ...
}

проблема была решена для меня, когда я переместил имя таблицы из @Table в @Entity

@Entity(name = "NOTIFICATION")
@Table
public class Notification {
    ...
}

Ответ 8

Просто, если вы используете две схемы, вы получите эту ошибку. Чтобы устранить эту ошибку, вы можете использовать эти шаги:

1. You need to delete extra schema.
2. Or u can define default schemas or that schema are u using.

spring.jpa.properties.hibernate.default_schema=nameOfSchema
and
jdbc:postgresql://localhost:5432/databaseName?currentSchema=nameOfSchema