2012-07-26 112 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权限?