Java ORA-02291:违反完整性约束-尝试在外键中插入null时未找到父键
我需要在同一个表中的某一列中添加外键约束。 例如,我有一个表项目,它有一个主键列“id”,另一个列“dependency\u PROJECT\u id”,它是引用“id”列的外键 我更改了我的表并添加了如下约束: ALTER TABLE PROJECT ADD CONSTRAINT FK_DEPENDENCY_PROJECT_ID外键(DEPENDENCY_PROJECT_ID)引用项目(ID) 但是,我的第二个要求是,“dependency\u project\u id”列在某些情况下可以为空。 但是,如果我试图在dependency_project_id列中插入null,则会出现错误“ORA-02291:违反完整性约束-未找到父密钥” 请注意,我使用JPA将数据持久化到数据库中。但是,如果我直接在数据库的dependency\u project\u id列中插入null,我就可以毫无问题地这样做 这是我的实体Java ORA-02291:违反完整性约束-尝试在外键中插入null时未找到父键,java,oracle,jpa,Java,Oracle,Jpa,我需要在同一个表中的某一列中添加外键约束。 例如,我有一个表项目,它有一个主键列“id”,另一个列“dependency\u PROJECT\u id”,它是引用“id”列的外键 我更改了我的表并添加了如下约束: ALTER TABLE PROJECT ADD CONSTRAINT FK_DEPENDENCY_PROJECT_ID外键(DEPENDENCY_PROJECT_ID)引用项目(ID) 但是,我的第二个要求是,“dependency\u project\u id”列在某些情况下可以为空
package com.oracle.estimationtool.model;
导入java.util.List;
导入javax.json.bind.annotation.JsonbTransient;
导入javax.persistence.Access;
导入javax.persistence.AccessType;
导入javax.persistence.Basic;
导入javax.persistence.CascadeType;
导入javax.persistence.Column;
导入javax.persistence.Entity;
导入javax.persistence.FetchType;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
导入javax.persistence.JoinColumn;
导入javax.persistence.Lob;
导入javax.persistence.manytone;
导入javax.persistence.NamedQuery;
导入javax.persistence.OneToMany;
导入javax.persistence.SequenceGenerator;
导入javax.persistence.Table;
导入javax.validation.constraints.NotBlank;
导入javax.validation.constraints.Size;
@实体(名称=“项目”)
@表(name=“项目”)
@访问权限(值=AccessType.FIELD)
@SequenceGenerator(name=“ProjectSeq”,sequenceName=“PROJECT_SEQ”,allocationSize=50)
@NamedQuery(name=“Project.findProject”,query=“从项目p中选择p,其中p.id=:id”)
公共类项目扩展了BaseEntity{
@身份证
@GeneratedValue(generator=“ProjectSeq”,strategy=GenerationType.SEQUENCE)
私有整数id;
@独身癖
@JoinColumn(name=“PROJECT\u ID”)
私有列表解决方案组件估计;
@列(columnDefinition=“CLOB NULL”,name=“BUSINESS\u EVENTS”,nullable=true)
@高球
@基本(可选=真)
私人活动;
@列(可空=真,精度=10,刻度=4)
@基本(可选=真)
私人双倍期限;
@OneToMany(cascade=CascadeType.ALL,orphan=true)
@JoinColumn(name=“PROJECT\u ID”)
私有列表项目;
@列(name=“name”,长度=255,可空=false)
@基本(可选=假)
@尺寸(最大值=255)
@不空白
私有字符串名称;
@列(name=“DEPENDENCY\u PROJECT\u ID”,null=true)
@基本(可选=真)
私有int dependencProjectId;
@列(name=“DEPENDENCY\u START”,nullable=true)
@基本(可选=真)
私有布尔依赖性;
@列(name=“DEPENDENCY_DELTA”,nullable=true)
@基本(可选=真)
私人独立三角洲;
@许多酮
@JoinColumn(name=“ROADMAP\u ID”)
@JsonbTransient
私人路线图;
公共工程(){
}
公共项目(列出解决方案组件估算、列出业务事件、,
双持续时间,字符串名称){
this.solutionComponentEstimates=solutionComponentEstimates;
this.businessEvents=businessEvents;
这个。持续时间=持续时间;
this.name=名称;
}
公共整数getId(){
返回id;
}
公共无效集合id(整数id){
this.id=id;
}
公共列表getSolutionComponentEstimates(){
回归解分量估计;
}
公共void集合解决方案组件估算(列出解决方案组件估算){
this.solutionComponentEstimates=solutionComponentEstimates;
}
公共列表getBusinessEvents(){
返回businessEvents;
}
公共业务事件(列出业务事件){
this.businessEvents=businessEvents;
}
公共双getDuration(){
返回时间;
}
公共无效设置持续时间(双倍持续时间){
这个。持续时间=持续时间;
}
公共列表getScvproject(){
返回SCVP项目;
}
公共工程(SCV项目清单){
this.scvproject=scvproject;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
public int getDependencyProjectId(){
返回dependencyProjectId;
}
public void setDependencyProjectId(int dependencyProjectId){
this.dependencyProjectId=dependencyProjectId;
}
公共布尔值isDependencyStart(){
回归艺术;
}
public void setDependencyStart(布尔dependencyStart){
this.dependencyStart=dependencyStart;
}
public int getDependencyDelta(){
返回依赖增量;
}
public void setDependencyDelta(int dependencyDelta){
this.dependencyDelta=dependencyDelta;
}
公共路线图getRoadmap(){
返回路线图;
}
公共路线图(路线图){
this.roadmap=路线图;
}
}
我是JPA的新手。我有什么遗漏或解决方法吗?非常感谢您的帮助。您应该将依赖项\u项目\u ID映射为整数,而不是整数。
int不能有空值。如果未设置,则该值为0,因此会违反约束。如您所注意的,直接插入有效-因此允许空值。这意味着JPA不能传递null,否则不会违反FK,从而从数据库中引发错误。所以我想问JPA是不是让你的空的东西
package com.oracle.estimationtool.model;
import java.util.List;
import javax.json.bind.annotation.JsonbTransient;
import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
@Entity(name = "Project")
@Table(name = "PROJECT")
@Access(value = AccessType.FIELD)
@SequenceGenerator(name = "ProjectSeq", sequenceName = "PROJECT_SEQ", allocationSize = 50)
@NamedQuery(name = "Project.findProject", query = "SELECT p from Project p where p.id = :id")
public class Project extends BaseEntity {
@Id
@GeneratedValue(generator = "ProjectSeq", strategy = GenerationType.SEQUENCE)
private Integer id;
@OneToMany
@JoinColumn(name = "PROJECT_ID")
private List<SolutionComponentEstimate> solutionComponentEstimates;
@Column(columnDefinition = "CLOB NULL", name = "BUSINESS_EVENTS", nullable = true)
@Lob
@Basic(optional = true)
private List<BusinessEvent>businessEvents;
@Column(nullable = true, precision = 10, scale = 4)
@Basic(optional = true)
private Double duration;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "PROJECT_ID")
private List<SCVersionProject> scvproject;
@Column(name = "NAME", length = 255, nullable = false)
@Basic(optional = false)
@Size(max = 255)
@NotBlank
private String name;
@Column(name = "DEPENDENCY_PROJECT_ID", nullable = true)
@Basic(optional = true)
private int dependencyProjectId;
@Column(name = "DEPENDENCY_START", nullable = true)
@Basic(optional = true)
private boolean dependencyStart;
@Column(name = "DEPENDENCY_DELTA", nullable = true)
@Basic(optional = true)
private int dependencyDelta;
@ManyToOne
@JoinColumn(name = "ROADMAP_ID")
@JsonbTransient
private Roadmap roadmap;
public Project() {
}
public Project(List<SolutionComponentEstimate> solutionComponentEstimates, List<BusinessEvent> businessEvents,
Double duration, String name) {
this.solutionComponentEstimates = solutionComponentEstimates;
this.businessEvents = businessEvents;
this.duration = duration;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public List<SolutionComponentEstimate> getSolutionComponentEstimates() {
return solutionComponentEstimates;
}
public void setSolutionComponentEstimates(List<SolutionComponentEstimate> solutionComponentEstimates) {
this.solutionComponentEstimates = solutionComponentEstimates;
}
public List<BusinessEvent> getBusinessEvents() {
return businessEvents;
}
public void setBusinessEvents(List<BusinessEvent> businessEvents) {
this.businessEvents = businessEvents;
}
public Double getDuration() {
return duration;
}
public void setDuration(Double duration) {
this.duration = duration;
}
public List<SCVersionProject> getScvproject() {
return scvproject;
}
public void setScvproject(List<SCVersionProject> scvproject) {
this.scvproject = scvproject;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDependencyProjectId() {
return dependencyProjectId;
}
public void setDependencyProjectId(int dependencyProjectId) {
this.dependencyProjectId = dependencyProjectId;
}
public boolean isDependencyStart() {
return dependencyStart;
}
public void setDependencyStart(boolean dependencyStart) {
this.dependencyStart = dependencyStart;
}
public int getDependencyDelta() {
return dependencyDelta;
}
public void setDependencyDelta(int dependencyDelta) {
this.dependencyDelta = dependencyDelta;
}
public Roadmap getRoadmap() {
return roadmap;
}
public void setRoadmap(Roadmap roadmap) {
this.roadmap = roadmap;
}
}