2017-01-01 26 views
1

糾正我,如果我錯了!
通常情況下,如果hbm2ddl.auto設置爲「UPDATE」,hibernate會檢查表是否存在於數據庫中,如果不存在,它會創建該表並推送數據,如果表存在,則只是將數據添加到該表中。
for hbm2ddl.auto = update,我觀察到的是,在每次插入之前,hibernate都試圖創建表。儘管表存在,它會在日誌中拋出異常,然後hibernate會知道表的存在。
這是一個正常的行爲?或者我錯過了什麼?hbm2ddl.auto設置爲「更新」,但它試圖在每次插入前創建表格

看看下面的日誌與控制檯的log4j的幫助下產生的,請..

Hibernate: create table UsersCC (userID int4 not null, userDOB date, userEmail varchar(255), userPswd varchar(255), primary key (userID)) 
23:02:27,799 WARN ExceptionHandlerLoggedImpl:27 - GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement 
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement 
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) 
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:524) 
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:470) 
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.createTable(AbstractSchemaMigrator.java:273) 
    at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:71) 
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:203) 
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:110) 
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:183) 
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:309) 
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:445) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:710) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726) 
    at com.hibernate.Setup.SetupTest.main(SetupTest.java:19) 
Caused by: org.postgresql.util.PSQLException: ERROR: relation "userscc" already exists 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2310) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2023) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:217) 
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:421) 
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:318) 
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:310) 
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) 
    ... 13 more 
Hibernate: insert into UsersCC (userDOB, userEmail, userPswd, userID) values (?, ?, ?, ?) 
23:02:27,998 TRACE BasicBinder:65 - binding parameter [1] as [DATE] - [Sun Jan 01 23:02:25 IST 2017] 
23:02:27,999 TRACE BasicBinder:65 - binding parameter [2] as [VARCHAR] - [[email protected]] 
23:02:28,000 TRACE BasicBinder:65 - binding parameter [3] as [VARCHAR] - [lenovo18] 
23:02:28,004 TRACE BasicBinder:65 - binding parameter [4] as [INTEGER] - [101] 
23:02:28,013 INFO pooling:230 - HHH10001008: Cleaning up connection pool [jdbc:postgresql://localhost:5432/campusCafeDb] 

如果正常的話,是不是一個性能問題?

+0

謝謝..我讓hbm2ddl.auto沉默。 :d。無論如何,你能否在你評論中提到的VALIDATE中闡述一些內容? – lovelyim92

回答

2

hbm2ddl.auto驗證: 如果該值是有效的,那麼hibernate只驗證表和列是否存在。如果表不存在,hibernate會拋出異常。 Validate是hbm2ddl.auto的默認值。

hbm2ddl.auto更新: 如果值是更新,然後休眠檢查表和列。如果表格不存在,那麼它會創建一個新表格,如果一個列不存在,它會爲它創建一個新列。

此鏈接對所有的值都有很好的解釋。

http://www.onlinetutorialspoint.com/hibernate/hbm2ddl-auto-example-hibernate-xml-config.html

none是非官方的價值我猜。我發現它在某個地方在stackoverflow,但我忘了在哪裏。

+0

感謝您的回覆。 (y) – lovelyim92

+0

這是如何回答這個問題的?根據你寫的內容,「更新」不應該創建表,如果它們已經存在,這是OP描述的問題。 – Lodovik

相關問題