Java ORA-02291:违反完整性约束-尝试在外键中插入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”列在某些情况下可以为空

我需要在同一个表中的某一列中添加外键约束。 例如,我有一个表项目,它有一个主键列“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,我就可以毫无问题地这样做

这是我的实体

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

}