ORA-02291: нарушено ограничение целостности - родительский ключ не найден При попытке вставить нуль во внешний ключ - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть требование, когда я должен добавить ограничение внешнего ключа для определенного столбца в той же таблице. Например, у меня есть таблица PROJECT, в которой есть столбец первичного ключа "id" и другой столбец "dependency_project_id", который является внешним ключом, ссылающимся на столбец "id".

Я изменил свою таблицу и добавил ограничение как ниже .: ALTER TABLE PROJECT ADD CONSTRAINT FK_DEPENDENCY_PROJECT_ID FOREIGN KEY (DEPENDENCY_PROJECT_ID) REFERENCES PROJECT (ID);

Однако мое второе требование заключается в том, чтобы столбец "dependency_project_id" в некоторых случаях мог быть пустым. Но если я пытаюсь вставить ноль в столбец dependency_project_id, я получаю сообщение об ошибке «ORA-02291: нарушение целостности - родительский ключ не найден».

Обратите внимание, что я использую JPA для сохранения моих данных в БД. Тем не менее, если я напрямую вставляю ноль в столбец dependency_project_id в базе данных, я могу сделать это без каких-либо проблем.

Вот моя сущность.

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

}

Я новичок в JPA. Есть ли что-то, что я пропускаю или есть обходной путь для этого? Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 21 февраля 2020

Вы должны отобразить DEPENDENCY_PROJECT_ID в Integer вместо int. int не может иметь нулевое значение. Если не установлено, значение равно 0, и, следовательно, нарушение ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...