gpt4 book ai didi

java - 使用非主键列的实体映射

转载 作者:行者123 更新时间:2023-11-29 23:17:27 26 4
gpt4 key购买 nike

我在java项目中使用hibernate和Mysql进行持久化。我有两个实体交易服务。事务与服务具有多对一的关系。我想使用服务表中 VARCHAR 类型的非主列(SERVICE_CODE)作为事务表中的外键。但是当我这样做时,我得到以下异常。

SQL Error: 1452, SQLState: 23000
Cannot add or update a child row: a foreign key constraint fails.

SERVICE_CODE 被定义为非空且在数据库中唯一。如果我使用服务表中的主键进行映射,以下示例可以正常工作。

@Entity
@Table(name="Transaction")
public class Transaction {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="TRANSACTION_ID")
long transactionId;


@ManyToOne
@JoinColumn(name="SERVICE_CODE")
Service service;
}


@Entity
@Table(name="SERVICE")
public class Service {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="SERVICE_ID")
Long serviceId;

@Column(name="SERVICE_CODE")
String serviceCode;
}

最佳答案

this article 中所述,您应该使用 referencedColumnName @JoinColumn 注解的属性来指定外键关系的引用列。

@ManyToOne
@JoinColumn(name="SERVICE_CODE", referencedColumnName="SERVICE_CODE")
Service service;

通过此修改,DDL 可以正确生成,如下所示:

alter table Transaction
add constraint FK_5k37nrtsvi22y2jhsde903ps9
foreign key (SERVICE_CODE)
references SERVICE (SERVICE_CODE);

并使用这样的原始代码(它引用 SERVICE 表的主键而不是 SERVICE_CODE 列):

alter table Transaction
add constraint FK_5k37nrtsvi22y2jhsde903ps9
foreign key (SERVICE_CODE)
references SERVICE;

关于java - 使用非主键列的实体映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27649447/

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