2016-04-28 31 views
7

Stawiłem czoła temu dziwnemu wyjątkowi, próbując utrwalić pewne wartości w tabeli przy użyciu Hibernate w aplikacji Java. Jednak ten wyjątek występuje tylko dla jednej konkretnej tabeli/encji dla reszty tabel, jestem w stanie wykonać operacje crud poprzez Hibernate.Więcej niż jedna tabela znajdująca się w przestrzeni nazw (,) - SchemaExtractionException

Proszę znaleźć poniżej Stacktrace i daj mi znać, jeśli jest to w jakikolwiek sposób związane z kodem java lub jego błąd projektu bazy danych.

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) 

Dzięki z góry za pomoc

Odpowiedz

6

miałem ten sam problem i udało się dokopać do kodu, aby znaleźć przyczynę, przynajmniej w moim przypadku. Nie wiem, czy będzie to dla ciebie ten sam problem, ale może to być pomocne.

Z wykresu stosu widzę, że masz ustawioną opcję hibernate.hbm2ddl.auto do uaktualnienia schematu. W ramach tego próbuje wyszukać metadane dla wszystkich tabel, o których wie hibernacja, i dla jednego z nich uzyskuje niejednoznaczną odpowiedź, ponieważ zapytanie o metadane zwraca więcej niż jeden wiersz tabeli lub widok metadanych.

W moim przypadku było to spowodowane przez naszą konwencję nazewnictwa dla tabel. Mieliśmy stół nazwany (powiedzmy) "AAA_BBB", dla którego to się nie zgadzało. Teraz użycie podkreślenia w nazwie tabeli jest całkowicie akceptowalne, o ile wiem, i jest dość powszechną praktyką. Jednak podkreślenie jest także symbolem wieloznacznym SQL dla pojedynczego znaku; patrząc w kod dla metadanych bazy danych widzę, że robi "WHERE nazwa_tabeli nazwa LIKE ..." w metodzie DatabaseMetaData.getTables (...), która jest tutaj używana przez hibernację.

Teraz w moim schemacie miałem też drugi stół o nazwie "AAA1BBB", a więc oba te elementy pasowały do ​​wyszukiwania metadanych i dlatego zwrócił wiersz metadanych dla każdej z tych tabel. Metoda hibernacji jest zapisywana, aby po prostu spadła, jeśli zestaw wyników z wyszukiwania metadanych tabeli zwróci więcej niż jeden wiersz. Przypuszczam, że powinien zbadać dostępny wiersz (y) i ustalić, czy istnieje taki, który jest dokładnym dopasowaniem do podanej nazwy tabeli.

Testowałem to zarówno dla Oracle, jak i MySQL z tym samym wynikiem.

+0

Podniosłem to jako problem z Hibernate ORM https://hibernate.atlassian.net/browse/HHH-10718 i mam proponowaną poprawkę, którą testuję i mam nadzieję przesłać. – RichB

+0

Dzięki RichB, zauważyłem jednak, że w schemacie bazy danych istnieje inny użytkownik, który utworzył tę samą tabelę. Może to być przyczyną, że hibernacja jest w stanie zobaczyć dwie tablice w przestrzeni nazw. – Anuj

+0

Czy istnieje sposób ograniczenia wyszukiwania w trybie hibernacji tylko do jednego użytkownika tego schematu, a nie wszystkich użytkowników pod nim? Obecnie problem został rozwiązany przez usunięcie tego użytkownika, ponieważ nie było to wymagane. [Przetestowałem to, replikując kolejną tabelę o tej samej nazwie u innego użytkownika i daje to ten sam problem.] Jednak idąc dalej, długoterminowe rozwiązanie tego problemu będzie najlepsze, gdzie w hibernacji możemy ograniczyć wyszukiwanie naszego obiektu do konkretnego użytkownika schematu, a nie wszystkich jego użytkowników. – Anuj

5

Wygląda na to, że właściwość hibernate.hbm2ddl.auto ustawiona na aktualizację powoduje problem tutaj. Spróbuj usunąć go z pliku konfiguracyjnego hibernacji xml.

+0

To działało przez usunięcie właściwości hbm2ddl.auto. Wielkie dzięki. Jednak wyjaśnienie, dlaczego spowodowało ten problem, będzie wspaniałe. – Anuj

2

Zastosowanie wartość katalog z @Table, tj .:

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

} 

Nie mam ten błąd teraz. Mam nadzieję, że ta praca.

3

To będzie działać:

Sprawdź swoje bazy danych schematu/S i swoje uprawnienia użytkownika bazy danych;

Mechanizm aktualizacji hibernacji może nie działać z tym wyjątkiem, jeśli istnieje inny schemat bazy danych/użytkownik o tej samej nazwie tabeli, a użytkownik bazy danych ma wystarczające uprawnienia do wyświetlenia tej tabeli.

W twoim przypadku tabelę "RRRRRRR" można znaleźć w więcej niż jednym użytkowniku/schemacie bazy danych, a użytkownik bazy danych ma uprawnienia "DBA".

Aby rozwiązać ten problem, można znaleźć i usunąć niejednoznaczną tabelę lub usunąć nadmiarowe uprawnienia użytkownika.

1

Inna sytuacja może się zdarzyć, z wyjątkiem tego, co zostało powiedziane, RichB. w ORACLE każdy użytkownik ma oddzielny schemat, Dlatego prawdopodobnie nie ma stoliki holownicze o tej samej nazwie w dwóch różnych schematów następnie należy określić domyślny schemat w persistence.xml z poniżej własności

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

To poprawne rozwiązanie. Pomogło mi to. – user