在SQL Server中的非主键上添加@ManyToOne映射时出现问题

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

当Hibernate通过启动他想要创建的服务器(通过hibernate.hbm2ddl.auto在更新时设置)来更新数据库时,数据库但外键失败时出现以下错误:

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;
}

  编辑:
SQL看起来像这样:

table1中的键:

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

谢谢

最佳答案 以下是JPA规范关于Id注释的内容:

9.1.8 Id Annotation

The Id annotation specifies the
primary key property or field of an
entity. The Id annotation may be
applied in an entity or mapped
superclass.

By default, the mapped column for the
primary key of the entity is assumed
to be the primary key of the primary
table. If no Column annotation is
specified, the primary key column name
is assumed to be the name of the
primary key property or field.

所以我很想说事情的行为符合规范(登录属性实际上映射到id列).尝试指定列注释:

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

I can’t recreated the table1 because this is an excisting table. I must use the alter table option from the DLL: “alter table table2 add constraint FK1751F2B3CEB31922 foreign key (table1_login) references table1” and I rather want the referential integrity.

为了澄清,这里是维基百科关于外键的内容:外键在一个(引用)表中标识一列或一组列,引用另一个(引用)表中的一组列.引用表中的列必须是引用表中的主键或其他候选键.

所以,虽然你不能应用上面的alter语句(table1_login不能引用table1的id,你可以在table1中使登录唯一并创建一个引用login的FK约束.这样的东西:

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

这假设您在table1中的登录时添加了UNIQUE约束.

也可以看看

> FOREIGN KEY Constraints

点赞