2015-04-16 64 views
2

我已經看到了幾個相關的問題和他們的答案,但它並沒有幫助我的情況。Liquibase:MySqlSyntaxErrorException:表已存在

我有一個Spring引導應用程序,我使用Jhipster創建了實體,另外我自己也添加了一些手動更改日誌變更集。

我有一個醫生實體,其中包含與'專業'的一對多單向關係,其中'醫生'是關係的所有者。所以我指定了一個存儲Doctor和Specialty外鍵的Join表。

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinTable(
     name="T_DOCTOR_SPECIALTY", 
     joinColumns = @JoinColumn(name="doctor_id"), 
     inverseJoinColumns = @JoinColumn(name="specialty_id") 
) 
private List<Specialty> specialties = new ArrayList<>(); 

對於這一點,我添加了一個更新日誌文件,甚至包含標記,如果它已經存在忽視專業,

<changeSet id="20150415081455" author="waqas"> 
    <preConditions onFail="MARK_RAN"> 
     <not> 
      <tableExists tableName="T_DOCTOR_SPECIALTY"/> 
     </not> 
    </preConditions> 
</changeSet> 

<changeSet id="20150415081221" author="waqas"> 

    <createTable tableName="T_DOCTOR_SPECIALTY"> 

     <column name="id" type="bigint" autoIncrement="true"> 
      <constraints primaryKey="true" nullable="false"/> 
     </column> 
     <column name="doctor_id" type="bigint"> 
      <constraints nullable="false" /> 
     </column> 
     <column name="specialty_id" type="bigint"> 
      <constraints nullable="false" /> 
     </column> 
    </createTable> 

    <addForeignKeyConstraint baseColumnNames="doctor_id" 
          baseTableName="T_DOCTOR_SPECIALTY" 
          constraintName="fk_doctor_id" 
          referencedColumnNames="id" 
          referencedTableName="T_DOCTOR"/> 

    <addForeignKeyConstraint baseColumnNames="specialty_id" 
          baseTableName="T_DOCTOR_SPECIALTY" 
          constraintName="fk_specialty_id" 
          referencedColumnNames="id" 
          referencedTableName="T_SPECIALTY"/> 
</changeSet> 

然後,我創建一個沒有表的新數據庫和運行應用程序,但我得到以下異常:

(Error creating bean with name 'delegatingApplicationListener' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cache.annotation.ProxyCachingConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' is defined) 
[ERROR] org.springframework.boot.SpringApplication - Application startup failed 
org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'liquibase' defined in class path resource [io/aurora/ams/config/DatabaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.MigrationFailedException: Migration failed for change set classpath:config/liquibase/changelog/20150415081221_added_entity_Doctor_Specialty.xml::20150415081221::waqas: 
Reason: liquibase.exception.DatabaseException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 't_doctor_specialty' already exists 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE] 
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE] 
at io.aurora.ams.Application.main(Application.java:64) [bin/:na] 

Caused by: liquibase.exception.MigrationFailedException: Migration failed for change set classpath:config/liquibase/changelog/20150415081221_added_entity_Doctor_Specialty.xml::20150415081221::waqas: 
Reason: liquibase.exception.DatabaseException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 't_doctor_specialty' already exists 
at liquibase.changelog.ChangeSet.execute(ChangeSet.java:586) ~[liquibase-core-3.3.2.jar:na] 
at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:43) ~[liquibase-core-3.3.2.jar:na] 
at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:73) ~[liquibase-core-3.3.2.jar:na] 
at liquibase.Liquibase.update(Liquibase.java:200) ~[liquibase-core-3.3.2.jar:na] 
at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:353) ~[liquibase-core-3.3.2.jar:na] 
at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:317) ~[liquibase-core-3.3.2.jar:na] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE] 

Caused by: liquibase.exception.DatabaseException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 't_doctor_specialty' already exists 
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:316) ~[liquibase-core-3.3.2.jar:na] 
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:55) ~[liquibase-core-3.3.2.jar:na] 
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:122) ~[liquibase-core-3.3.2.jar:na] 
at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1227) ~[liquibase-core-3.3.2.jar:na] 
at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1210) ~[liquibase-core-3.3.2.jar:na] 
at liquibase.changelog.ChangeSet.execute(ChangeSet.java:550) ~[liquibase-core-3.3.2.jar:na] 

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 't_doctor_specialty' already exists 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_40] 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_40] 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_40] 
at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[na:1.8.0_40] 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.mysql.jdbc.Util.getInstance(Util.java:360) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:978) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2526) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2484) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:848) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:742) ~[mysql-connector-java-5.1.34.jar:5.1.34] 
at com.zaxxer.hikari.proxy.StatementProxy.execute(StatementProxy.java:83) ~[HikariCP-2.2.5.jar:na] 
at com.zaxxer.hikari.proxy.StatementJavassistProxy.execute(StatementJavassistProxy.java) ~[HikariCP-2.2.5.jar:na] 
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:314) ~[liquibase-core-3.3.2.jar:na] 

我想指出的關係在20150415081221_added_entity_Doctor_Specialty.xml的changelog只提到,在沒有醫生。

我搜查了很多,但不知道可能是什麼原因造成的。任何幫助都感激不盡。

+0

其他表格是如何創建的?通過Hibernate,或者一切都在liquibase變更集中? –

+0

在liquibase變更集中。儘管我使用JHipster創建了Doctor實體,但OneToMany關係並未在任何地方指定。所以我必須自己爲Doctor_Specialty創建一個單獨的更新日誌。 如果我刪除更改日誌,Doctor_Specialty表永遠不會創建 –

+0

表是由jhipster在開始時創建的,之後liquibase正在運行,試圖創建相同的表。這就是你遇到錯誤的原因。 –

回答

5

雖然我現在還不能確定確切的問題是Liquibase關於此錯誤的東西,使用前提標籤的解決辦法是行不通的,因爲一個約束,Liquibase文檔中提到的:

「外面一個變更(例如,在更改日誌的開始),只有HALT和WARN是可能的值。「

在createTable之前在preset中放置preCondition是我所缺少的。

<changeSet id="20150415081221" author="waqas"> 
    <preConditions onFail="MARK_RAN"> 
     <not> 
      <tableExists tableName="T_DOCTOR_SPECIALTY"/> 
     </not> 
    </preConditions> 
    <createTable tableName="T_DOCTOR_SPECIALTY">...