java.sql.SQLIntegrityConstraintViolationException:ORA-02291:违反完整性约束 - 找不到父键

问题描述 投票:0回答:1

Table relationship> 我正在尝试将数据插入 3 个不同的表中 - JV_SNAPSHOT、JV_GLOBAL_ID、JV_COMMIT。其对应的Bean类如下:

@Entity
@Table(name = "JV_SNAPSHOT")
public class JVSnapshot {
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "jv_snapshot_pk_seq")
    @SequenceGenerator(name="jv_snapshot_pk_seq", sequenceName = "JV_SNAPSHOT_PK_SEQ")
    @Column(name = "SNAPSHOT_PK")
    private long snapshotID;
    
    @Column(name="VERSION")
    private long version;
    
    @Column(name="GLOBAL_ID_FK")
    private long globalID;
    
    @Column(name="COMMIT_FK")
    private long commitID;

    @Column(name = "TYPE")
    private String type;
    
    @Column(name = "MANAGED_TYPE")
    private String managedType;
    
    @Column(name = "STATE")
    private String state;
    
    @Column(name = "CHANGED_PROPERTIES")
    private String changedProperties;
    
    @OneToOne(mappedBy = "jvSnapshot")
    //@JoinColumn(name = "id")
    private JVGlobalID jvGlobalID;
    
    @OneToOne(mappedBy = "jvSnapshot")
    //@JoinColumn(name = "id")
    private JVCommit jvCommit;
@Entity
@Table(name = "JV_GLOBAL_ID")
public class JVGlobalID {
@Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "jv_global_id_pk_seq")
    @SequenceGenerator(name="jv_global_id_pk_seq", sequenceName = "JV_GLOBAL_ID_PK_SEQ")
    @Column(name = "GLOBAL_ID_PK")
    private long globalID;

    @Column(name = "LOCAL_ID")
    private String localID;
    
    @Column(name = "FRAGMENT")
    private String fragment;
    
    @Column(name = "TYPE_NAME")
    private String typeName;
    
    @Column(name="OWNER_ID_FK")
    private long ownerID;
    
    @OneToOne @MapsId
    private JVSnapshot jvSnapshot;
@Entity
@Table(name = "JV_COMMIT")
public class JVCommit {
@Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "jv_commit_pk_seq")
    @SequenceGenerator(name="jv_commit_pk_seq", sequenceName = "JV_COMMIT_PK_SEQ")
    @Column(name= "COMMIT_PK" , insertable = true, updatable = false)
    private long id;

    @Column(name = "AUTHOR")
    private String author;
    
    @Column(name = "COMMIT_DATE")
    private Date commitDate;
    
    @Column(name = "COMMIT_DATE_INSTANT")
    @JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    private String commitDateInstant;
    
    @Column(name="COMMIT_ID")
    private long commitId;  
    
    @OneToOne @MapsId
    private JVSnapshot jvSnapshot;

Service 类,其中计算值和插入数据的整个业务逻辑如下:

JVSnapshot jvSnapshot = new JVSnapshot();
//inserting data into JV_GLOBAL_ID table
System.out.println("Inserting in JV_GLOBAL_ID table");
JVGlobalID jvGlobalId = new JVGlobalID();
jvGlobalId.setTypeName("com.dev.neo.models.Customer");
jvGlobalId.setLocalID("99999");
jvCommitGlobalIdRepository.save(jvGlobalId); //globalID generated (PK)
System.out.println("Data inserted in jvcommitGlobalrespository");
                    
//inserting data into JV_COMMIT table
System.out.println("Inserting in JV_COMMIT table");
JVCommit jvCommit = new JVCommit();
List<Long> jvCommitObjectList = jvCommitRepository.getMaxCommitId();
Long commitId = jvCommitObjectList.get(0) + 1;
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
jvCommit.setAuthor(req.getCheckerId());
jvCommit.setCommitDate(new Date());
jvCommit.setCommitDateInstant(date);
jvCommit.setCommitId(commitId);
System.out.println("Data inserted Successfully");
jvSnapshot.setJvCommit(jvCommit);
jvCommitRepository.save(jvCommit);   //id generated (PK)
System.out.println("JV_COMMIT Data saved Successfully");
jvSnapshot.setCommitID(jvCommit.getId());
jvSnapshotRepository.save(jvSnapshot);
                    
//inserting data into JV_SNAPSHOT table
System.out.println("Inserting in JV_SNAPSHOT table");
//CLOB Datatypes variables
                    
String existingCustomerIDNew = "somenewString";
String existingCustomerID = "someString";
jvSnapshot.setState(existingCustomerIDNew);
jvSnapshot.setChangedProperties(existingCustomerID);
                    jvSnapshot.setManagedType("com.dev.neo.models.Customer");
jvSnapshot.setType("UPDATE");
jvSnapshot.setVersion(2);
jvSnapshot.setGlobalID(jvGlobalId.getGlobalID());
System.out.println("Data inserted in all JV");

完成所有步骤后,数据未反映到表中并出现错误,如

"Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-02291: integrity constraint (SYSTEM.JV_SNAPSHOT_GLOBAL_ID_FK) violated - parent key not found"
JV_SNAPSHOT_GLOBAL_ID_FK 是 JV_SNAPSHOT 表的“GLOBAL_ID_FK”列的外键约束名称,该列链接到 JV_GLOBAL_ID 的“GLOBAL_ID_PK”主键列

我尝试了其他方法来声明这些表的一对一映射,但没有一个因素起作用。

hibernate jpa spring-data-jpa hibernate-mapping one-to-one
1个回答
0
投票

在您的实体 JVSnapshot 中,您应该像这样编辑映射:

@OneToOne @JoinColumn(name = "GLOBAL_ID_FK") 私有 JVGlobalID jvGlobalID;

@OneToOne @JoinColumn(name = "COMMIT_FK") 私有 JVCommit jvCommit;

在您的 JVGlobalID 中:

@OneToOne(mappedBy = "jvGlobalID") 私有 JVSnapshot jv快照;

在 JV 中也做同样的事情:

@OneToOne(mappedBy = "jvCommit") 私有 JVSnapshot jvSnapshot;

© www.soinside.com 2019 - 2024. All rights reserved.