2012-07-26 82 views
4

我現在面臨的以下問題:Hibernate對象的映射導致SQL錯誤(錯誤:150)與Liquibase

對於我的Java項目中,我使用了springframework的,Maven和數據庫管理的Hibernate 3.6和Liquibase變革管理。

現在我正面臨一個讓我心生疑慮的問題。它與應從Hibernate創建的外鍵約束有關。

2類有具有關係的對象實體。看下面的代碼:

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class SearchSingle extends OfferSearch implements Comparable<SearchSingle>, OfferSingle { 
    private static final long serialVersionUID = 7618785527154737982L; 

@ManyToOne 
private Route routeOutbound; 

@ManyToOne 
private Route routeWayBack; 
... 
... 
} 

現在其他類有相應的對象:

@JsonAutoDetect 
@Entity 
public class Route extends PersistentObject { 

private static final long serialVersionUID = -4611710805557036851L; 
@OneToMany(mappedBy = "routeOutbound") 
@Cascade(CascadeType.SAVE_UPDATE) 
private List<SearchSingle> searchesOutbound; 

@OneToMany(mappedBy = "routeWayBack") 
@Cascade(CascadeType.SAVE_UPDATE) 
private List<SearchSingle> searchesWayBack; 

... 
} 

看到這裏所產生的錯誤我在tomcat了日誌:

SEVERE 26.07.12 10:12:liquibase: Change Set classpath:dbchangelog.xml::1343227727949-11::mirco (generated) failed. Error: Error executing SQL ALTER TABLE ridesingle ADD CONSTRAINT FKD5C95340EE9D2F8 FOREIGN KEY (routeoutbound) REFERENCES route (id) ON UPDATE NO ACTION ON DELETE NO ACTION: Can't create table 'backendtest.#sql-454_5f' (errno: 150) liquibase.exception.DatabaseException: Error executing SQL ALTER TABLE ridesingle ADD CONSTRAINT FKD5C95340EE9D2F8 FOREIGN KEY (routeoutbound) REFERENCES route (id) ON UPDATE NO ACTION ON DELETE NO ACTION: Can't create table 'backendtest.#sql-454_5f' (errno: 150)

什麼讓我困惑大多數情況是「無法創建表:後端測試」。這根本沒有意義,因爲backendtest是數據庫名稱而沒有表格。重新部署項目時出現此錯誤,Liquibase嘗試將從migrationdb發出的更改映射到項目使用的數據庫。

+0

錯誤,例如'不能創建表'後端測試。#sql-454_5f''可能表示約束之間有些衝突。例如,您可能需要在創建新約束之前刪除舊約束。雖然我不確定Liquibase如何處理它。 – axtavt 2012-07-26 09:32:17

+0

嗨@axtvat。 Thx 4你的回答。你是對的,這確實與conatrint有關。但liquibase應該處理這個問題。我做了幾十個這樣的約束,從來沒有一個問題......我想我得花更多的時間分析出了什麼問題...... – m0rb 2012-07-26 14:32:24

回答

0

Liquibase或其配置可能存在問題:某些DBMS使用臨時表的前綴#這一事實使我相信Liquibase或MySQL或其中的某個層嘗試執行ALTER TABLE「複製 - drop-create-copy「過程在過程中創建一個臨時表。

發佈ALTER TABLE的用戶是否具有backendtest數據庫中的CREATE [TEMPORARY] TABLE權限?