1. 程式人生 > >分享知識-快樂自己:Caused by: org.hibernate.tool.schema.extract.spi.SchemaExtractionException: More than one table found in namespace (, ) : Dept (XXX)

分享知識-快樂自己:Caused by: org.hibernate.tool.schema.extract.spi.SchemaExtractionException: More than one table found in namespace (, ) : Dept (XXX)

嘗試在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'許可權。

  要解決此問題,您可以查詢和刪除不明確的表,或刪除使用者的冗餘許可權。

@Entity
@Table(**catalog = "MY_DB_USER"**, name = "LOOKUP")
public class Lookup implements Serializable {
}
<property name="hibernate.default_schema" value="username"/>

Oracle:hibernate.default_schema=使用者名稱

Mysql:hibernate.default_schema=資料庫名稱