我現在面臨的以下問題: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 CONSTRAINTFKD5C95340EE9D2F8
FOREIGN KEY (routeoutbound
) REFERENCESroute
(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 TABLEridesingle
ADD CONSTRAINTFKD5C95340EE9D2F8
FOREIGN KEY (routeoutbound
) REFERENCESroute
(id
) ON UPDATE NO ACTION ON DELETE NO ACTION: Can't create table 'backendtest.#sql-454_5f' (errno: 150)
什麼讓我困惑大多數情況是「無法創建表:後端測試」。這根本沒有意義,因爲backendtest是數據庫名稱而沒有表格。重新部署項目時出現此錯誤,Liquibase嘗試將從migrationdb發出的更改映射到項目使用的數據庫。
錯誤,例如'不能創建表'後端測試。#sql-454_5f''可能表示約束之間有些衝突。例如,您可能需要在創建新約束之前刪除舊約束。雖然我不確定Liquibase如何處理它。 – axtavt 2012-07-26 09:32:17
嗨@axtvat。 Thx 4你的回答。你是對的,這確實與conatrint有關。但liquibase應該處理這個問題。我做了幾十個這樣的約束,從來沒有一個問題......我想我得花更多的時間分析出了什麼問題...... – m0rb 2012-07-26 14:32:24