gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:26:09 25 4
gpt4 key购买 nike

我在将 spring/hibernate 应用程序从 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;
}

表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 看起来像这样:

alt text

表 1 中的键:

alt text

表 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.



所以我很想说事情的行为符合规范(并且 login 属性实际上被映射到了 id 列)。尝试指定一个 Column注解:
@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.



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

因此,虽然您不能应用上述更改语句( table1_login 不能引用 table1 的 id,但您可以使 login 在 table1 中唯一 并创建一个 FK 约束来引用 login . 类似的东西:
ALTER TABLE table2
ADD CONSTRAINT FK_table2_table1
FOREIGN KEY (table1_login)
REFERENCES table1(login)

这假设您添加了 UNIQUE对表 1 中登录的约束。

也可以看看
  • FOREIGN KEY Constraints
  • 关于sql - 在 SQL Server 中的非主键上添加 @ManyToOne 映射时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3530393/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com