hbm2ddl.auto 设置为 "UPDATE" ,但它试图在每次插入之前创建表



如果我错了,请纠正我!
通常,如果 hbm2ddl.auto 设置为"UPDATE",hibernate 会检查该表是否存在于 db 中,如果不存在,它会创建该表并推送数据,如果表存在,它只是将数据添加到该表中。
对于 hbm2ddl.auto = update,我观察到的是,在每次插入之前,Hibernate 都会尝试创建表。尽管表存在,但它在日志中抛出异常,然后休眠知道表的存在。
这是正常行为吗?还是我错过了什么?

请在控制台中找到在 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] - [motogg@support.com]
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]

如果正常,那不是性能问题吗?

hbm2ddl.auto 验证 : 如果值是验证的,则休眠仅验证表和列是否存在。如果表不存在,则休眠会引发异常。验证是 hbm2ddl.auto 的默认值。

hbm2ddl.自动更新 : 如果值为更新,则休眠检查表和列。如果表不存在,则创建一个新表,如果列不存在,则为其创建新列。

此链接对所有值都有精美的解释。

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

我猜none是非官方价值。我在堆栈溢出的某个地方找到了它,但我忘记了在哪里。

这是暂时对我有用的,我完全评论了"hibernate.hbmddl.auto"属性,休眠停止尝试创建已经存在的表,见下文。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Connection settings -->
<property name="hibernate.connection.url">******</property>
<property name="hibernate.connection.username">******</property>
<property name="hibernate.connection.password">******</property>
<property 
name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect
</property>
<property name="hibernate.connection.isolation">2</property>
<property name="hibernate.connection.provider_class">
org.hibernate.service.jdbc.connections.internal.
C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.acquire_increment">5</property>
<property name="hibernate.connection.driver_class">
org.postgresql.Driver
</property>
<property name="hibernate.c3p0.unreturnedConnectionTimeout">30
</property>
<property  name="hibernate.c3p0.
debugUnreturnedConnectionStackTraces">true</property>
<property name="show_sql">true</property>
<!--<property name="hibernate.hbm2ddl.auto">update</property>-->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.timeout">120</property>
<mapping resource="dbstructure.hbm.xml" />
</session-factory>
</hibernate-configuration>

但是,我必须确保对表的其他更新分别在映射文件和 POJO 类中很好地映射

如果出现任何

错误,当它尝试执行任何 DDL 或 DML 操作时,我会在日志中看到它

干杯

最新更新