> 我正在尝试将数据插入 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”主键列
我尝试了其他方法来声明这些表的一对一映射,但没有一个因素起作用。
在您的实体 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;