我将春季/休眠应用程序从MySQL更改为SQL Server有问题。

当Hibernate通过启动他要创建的服务器来更新数据库时(通过 hibernate.hbm2ddl.auto 出发 update )数据库,但外交密钥未能以下错误:

Unsuccessful: alter table table2 add constraint FKDC2DC97ECEB31922 foreign key (login) references table1
Column 'table1.id' is not the same data type as referencing column 'table2.table1_login' in foreign key 'FKDC2DC97ECEB31922'.

映射如下:

表格1:

@Id
public String getLogin() {
    return login;
}
public void setLogin(String login) {
    this.login = login;
}

table2:

@ManyToOne
@JoinColumn (name = "table1_login", referencedColumnName = "login", insertable=false, updatable=false)
public Table1 getTable1() {
    return table1;
}
public void setTable1(Table1 table1) {
    this.table1= table1;
}

++编辑:SQL看起来喜欢以下内容:

alt text

table1的键:

alt text

Table Table1也由另一个应用程序使用,因此该表需要列“ ID”作为主键。因此,Table1.ID是表1的主要键。但是Hibernate并未使用此表1.ID,因为Hibernate将Table1.Login用作ID(请参见上面的注释)。但是,为什么SQL Server试图将外键设置为table1.id而不是对table1.login?

谢谢

有帮助吗?

解决方案

这是JPA规范所写的 Id 注解:

9.1.8 ID注释

ID注释指定实体的主要密钥属性或字段。 ID注释可以应用于实体或映射的超类。

默认情况下,假定实体的主键的映射列是主表的主要键。如果不 Column 指定注释,假定主键列名称为主密钥属性或字段的名称。

因此,我很想说事情按规格行事(以及 login 财产实际上被映射在 id 柱子)。尝试指定一个 Column 注解:

@Id @Column(name = "login")
public String getLogin() {
    return login;
}
public void setLogin(String login) {
    this.login = login;
}

我无法重新创建Table1,因为这是一个示出的表。我必须使用DLL中的Alter表选项:“ Alter Table Table2添加约束FK1751F2B3CEB31922外键(table1_login)引用表1”,我宁愿想要参考完整性。

为了澄清,这是维基百科关于外国钥匙的说法: 外键标识一个(引用)表中的一列或一组列,该表涉及另一个(引用)表中的一组列。参考表中的列 必须是主要钥匙或其他候选密钥 在引用表中。

因此,虽然您无法应用上述Alter语句(table1_login 无法引用 id table1,你可以做 login 独特 在Table1中并创建一个FK约束,该约束将引用 login. 。这样的东西:

ALTER TABLE table2
ADD CONSTRAINT FK_table2_table1
FOREIGN KEY (table1_login)
REFERENCES table1(login)

假设您添加了 UNIQUE 登录表1中的限制。

也可以看看

其他提示

编辑:

仔细阅读消息后,我发现了这个...

'table1.id'与引用列'table2.table1_login'不是相同的数据类型

表格1。ID - > table2。table1_login.

ID和登录不是相同的数据类型。因此,周围有一个错误的PK-FK关系...


这听起来您正在使用错误 collation. 。两列都需要相同的整理。否则您将无法加入它们。

http://msdn.microsoft.com/en-us/library/aa174903(SQL.80).aspx

确保您在数据库创建脚本上删除所有明确设置的校正。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top