java.sql.SQLIntegrityConstraintViolationException: ORA-02291: integrity constraint violated - parent key not found

73 Views Asked by At

Table relationship> I am trying to insert the data in 3 different tables - JV_SNAPSHOT, JV_GLOBAL_ID, JV_COMMIT. It's corresponding Bean class are given below:

@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;

The Service class where entire business logic to calculate the values and inserting the data is given below:

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");

After all the steps, the data are not reflecting into the tables and getting an error as "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 is the foreign key constraint name of "GLOBAL_ID_FK" column of JV_SNAPSHOT table which is linked to primary key column of "GLOBAL_ID_PK" of JV_GLOBAL_ID

I have tried alternative ways of declaring one to one mapping of these tables, but none of the factors worked.

1

There are 1 best solutions below

4
Amine ABBAOUI On

In your Entity JVSnapshot you should edit your mapping like that :

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

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

And In your JVGlobalID :

@OneToOne(mappedBy = "jvGlobalID") private JVSnapshot jvSnapshot;

And in JVCommit the same thing like that :

@OneToOne(mappedBy = "jvCommit") private JVSnapshot jvSnapshot;