首页 > 解决方案 > 未使用 @MapsId 找到父键

问题描述

我将 Java8、SpringBoot 2.3.7 和 JPA 与 Oracle 一起使用

有这张旧表(我不能碰它,因为它正在与其他应用程序一起生产)

TRANSFE (TRA_ID_PK NUMBER, ACCOUNT_ID NUMBER, .... )
CONSTRAINT "TRANSFE_UNIQUE" UNIQUE ("TRA_ID_PK")

在我的新应用程序中,一些新的 Transfe 将是 TransfeIn,只有一个字段,所以我创建了这个表

TRANSFE_IN (ID NUMBER, ....)
CONSTRAINT "TRANSF_IN_PK" PRIMARY KEY ("ID")

Jpa 一切正常:

@Entity
@Table(name = "TRANSFE")
public class Transfe implements Serializable {

    @Id
    @Column(name = "TRA_ID_PK")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_TRANSFES")
    @SequenceGenerator(name="SEQ_SW_TRANSFERENCIAS", sequenceName="SEQ_TRANSFES", allocationSize=1)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "TRA_ID")
    private Account account;

    @OneToOne(cascade = {CascadeType.ALL})
    @PrimaryKeyJoinColumn
    private TransfeIn transfeIn;

@Entity
@Table(name = "TRANSFE_IN")
public class TransferenciaEntrant {
    
    @Id
    private Long id;

    @MapsId
    @OneToOne(cascade = {CascadeType.ALL}, mappedBy = "transfeIn")
    @JoinColumn(name = "id")
    private Transfe transfe;

当我将其添加到 TRANSFE_IN 时出现问题

CONSTRAINT "TRANSFE_IN_FK" FOREIGN KEY ("ID") REFERENCES "TRANSFE" ("TRA_ID_PK")

所以当有一个新的 TransfeIn 存储时

accountRepository.save(account)

(帐户有一个 @OneToMany(mappedBy = "account", cascade = CascadeType.ALL) 列表转帐),我得到

SQLIntegrityConstraintViolationException: ORA-02291: integrity constraint (TRANSFE_ENTR_FK) violated - parent key not found

在日志中,我可以看到如何插入具有正确 ID(取自 SEQ_TRANSFES)的新 TRANSFE_IN 行。但是表 TRANSFE 是空的。

我究竟做错了什么?我不应该使用FK吗?或者注释中有什么要更改的?

标签: spring-boothibernatejpa

解决方案


推荐阅读