4

我将 spring/hibernate 应用程序从 MySql 更改为 SQL Server 时遇到问题。

当 Hibernate 通过启动他想要创建(通过hibernate.hbm2ddl.autoset on 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;
}

表2:

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

++edit:SQL 看起来像这样:

替代文字

表 1 中的键:

替代文字

表 table1 也被其他应用程序使用,因此该表需要列 'id' 作为主键。所以 table1.id 是 table1 的主键。但是hibernate不使用这个table1.id,因为hibernate使用table1.login作为id(见上面的注释)。但是为什么 SQL Server 试图将外键设置为 table1.id 而不是 table1.login ?

谢谢

4

2 回答 2

1

编辑:

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

“table1.id”与引用列“table2.table1_login”的数据类型不同

表格1。ID -> 表 2。table1_login

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


这听起来像您使用了错误的collation. 两列都需要相同的排序规则。否则你不能加入他们。

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

确保删除数据库创建脚本上所有显式设置的排序规则。

于 2010-08-20T11:32:27.617 回答
1

以下是 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 table 选项:“alter table table2 add constraint FK1751F2B3CEB31922 foreign key (table1_login) references table1”,我更想要参照完整性。

为了澄清,这是维基百科关于外键的说法:外键标识一个(引用)表中的一列或一组列,它引用另一个(引用)表中的一组列。引用表中的列必须是被引用表中的主键或其他候选键

因此,虽然您不能应用上面的 alter 语句(table1_login不能引用idtable1 的,但您可以在 table1 中设置login 唯一性并创建一个引用的 FK 约束login。类似的东西:

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

这假设您UNIQUE在 table1 中添加了登录约束。

也可以看看

于 2010-08-21T09:44:10.613 回答