使用非主键列的实体映射

时间:2014-12-25 17:41:39

标签: java mysql hibernate jpa

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

1 个答案:

答案 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;