最近在更新使用 hibernate5.2.10 时发现,配置 hibernate.hbm2ddl.auto = update 时会存在问题,首次启动可以正常的自动生成DDL去创建表,但当服务停止后再次启动时会报错,如下:
2017-05-23 16:25:46,894 [localhost-startStop-1] WARN [org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl] - 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:525) at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:470) at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.createTable(AbstractSchemaMigrator.java:273)
………………
Caused by: java.sql.SQLException: ORA-00955: 名称已由现有对象使用
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
………………
其次,hibernate.hbm2ddl.auto = update实体变更时没有自动更新数据库;
当我Entity java实体有增加字段时,重启服务还是包如上错误,根本不给我执行修改表结构的语句,我在使用Hibernate3的时候没有这样的情况;这里发现使用 update Hibernate 总是会重复去生成DDL并进行创建表,当然表本身已经存在了,所以一定会报错;
难道是这个版本Hibernate有毛病(开启了推卸责任的态度去思考问题),又将配置修改为hibernate.hbm2ddl.auto = create 时,没毛病,可以正常执行,但每次删表我肯定受不了;后台打印日志如下:
Hibernate: drop table A_TEST_COMPANY cascade constraints
Hibernate: drop sequence hibernate_sequence
Hibernate: create sequence hibernate_sequence start with 1 increment by 1
Hibernate: create table A_TEST_COMPANY (ID number(19,0) not null, COMPANY_ADDR varchar2(100 char), COMPANY_DESC varchar2(100 char), COMPANY_NAME varchar2(100 char), COMPANY_NAME_CN varchar2(100 char), COMPANY_PHONE varchar2(15 char), primary key (ID))
经过多方查证,发现有hibernate.default_