Более чем одна таблица найдена в пространстве имен (,) - 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