我在java项目中使用hibernate和Mysql进行持久化。 我有两个实体交易和服务。交易与服务有多对一的关系。 我想使用Service表中VARCHAR类型的非主列(SERVICE_CODE)作为Transaction表中的外键。但是当我这样做时,我得到以下异常。
SQL Error: 1452, SQLState: 23000
Cannot add or update a child row: a foreign key constraint fails.
SERVICE_CODE在数据库中定义为非null且唯一。 如果我使用Service表中的主键进行映射,以下示例工作正常。
@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;
}
答案 0 :(得分:0)
正如this article中所述,您应该使用@JoinColumn
注释的referencedColumnName
属性来指定外键关系的引用列。
@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;