在命名空間(,)中找到多個表 - SchemaExtractionException?
問題:
嘗試在Java應用程序中使用Hibernate將一些值保存到表中時,我一直面臨着這個奇怪的異常。
但是,只有一個特定的表/實體才會出現此異常,因為其余的表我可以通過Hibernate執行crud操作。
請在下面找到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)
樓主A:回答
我遇到了同樣的問題,並且能夠深入了解代碼以找出原因,至少在我的情況下。
我不知道你是否會遇到同樣的問題,但這可能會有所幫助。
從您的堆棧跟蹤中我可以看到您已將hibernate.hbm2ddl.auto設置為升級架構。
作為其中的一部分,它正在嘗試查找hibernate知道的所有表的元數據,並且其中一個表得到一個模棱兩可的答案,因為元數據查詢返回的不僅僅是一行表或視圖元數據。
在我的情況下,這是由我們的表的命名約定引起的。我們有一個名為(例如)“AAA_BBB”的表,這是錯誤的。
現在,就我所知,在表名中使用下划線是完全可以接受的,並且是很常見的做法。
但是下划線也是單個字符的SQL通配符; 查看數據庫元數據的代碼我可以看到它在DatabaseMetaData.getTables(...)方法中執行“WHERE table_name LIKE ...”,這是hibernate在這里使用的。
現在,在我的模式中,我還有一個名為“AAA1BBB”的第二個表,因此這兩個表都與元數據查找匹配,因此它返回了每個表的元數據行。
如果表元數據查找中的結果集返回多行,則寫入hibernate方法。我猜它應該檢查可用的行,並找出是否有一個與指定的表名完全匹配的行。
樓主B:回答
似乎屬性hibernate.hbm2ddl.auto設置為更新導致此問題。嘗試從你的hibernate配置xml中刪除它。
樓主C:回答
這將有效:檢查數據庫模式和數據庫用戶權限;
如果存在具有相同表名的另一個數據庫模式/用戶,並且db用戶具有查看此表的足夠權限,則Hibernate更新機制可能會因此異常而失敗。
因此,在您的情況下,可以在多個數據庫用戶/模式中找到表'YYYYYYY',並且您的db用戶具有'DBA'權限。
要解決此問題,您可以查找和刪除不明確的表,或刪除用戶的冗余權限。
樓主D:回答
使用目錄值@Table
,即:
@Entity @Table(**catalog = "MY_DB_USER"**, name = "LOOKUP") public class Lookup implements Serializable { }
我現在沒有這個錯誤。希望這項工作。
樓主E:回答
除了親愛的RichB之外,可能會發生另一種情況。
在ORACLE中,每個用戶都有單獨的模式,因此可能在兩個不同的方案中有兩個具有相同名稱的表,然后您應該在persistence.xml中使用以下屬性指定默認模式
<property name="hibernate.default_schema" value="username"/>
Oracle:hibernate.default_schema=用戶名
Mysql:hibernate.default_schema=數據庫名稱