hibernate 由于子表中的外键约束,无法删除父表行

mzillmmw  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(154)

我正在使用Hibernate 5.6,并且遇到了级联问题:
我有两张table:

CREATE TABLE public.srm_t_questionnaire_answer (
    rowguid bigserial NOT NULL,
    qa_fk_rfq_id int4 NULL,
    qa_fk_quote_id int4 NULL,
    qa_fk_supplier_id int4 NULL,
    qa_fk_questionnaire_id int4 NULL,
    qa_fk_question_id int4 NULL,
    qa_creation_date timestamp NOT NULL,
    qa_creation_user varchar(100) NOT NULL,
    qa_modification_date timestamp NOT NULL,
    qa_modification_user varchar(100) NOT NULL,
    CONSTRAINT srm_t_questionnaire_answer_pk PRIMARY KEY (rowguid)
);

CREATE TABLE public.srm_t_questionnaire_answer_value (
    fk_answer_id int4 NOT NULL,
    fk_option_id int4 NOT NULL,
    a_text_value text NULL,
    a_numeric_value numeric NULL,
    a_date_value timestamptz NULL,
    a_doc_valid_from timestamptz NULL,
    a_doc_valid_to timestamptz NULL,
    a_fk_doc_id int4 NULL,
    CONSTRAINT srm_t_questionnaire_answer_value_pk PRIMARY KEY (fk_answer_id, fk_option_id)
);

ALTER TABLE public.srm_t_questionnaire_answer_value ADD CONSTRAINT srm_t_questionnaire_answer_value_fk FOREIGN KEY (fk_answer_id) REFERENCES public.srm_t_questionnaire_answer(rowguid);
ALTER TABLE public.srm_t_questionnaire_answer_value ADD CONSTRAINT srm_t_questionnaire_answer_value_fk_1 FOREIGN KEY (fk_option_id) REFERENCES public.srm_t_question_option(rowguid);

Map如下所示:

@Entity
@Table(name = "srm_t_questionnaire_answer")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class SrmQsQuestionnaireAnswerVOImpl extends AbstractBasePropertiesImpl implements SrmQsQuestionnaireAnswerVO {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "srm_t_questionnaire_answer_rowguid_seq")
    @SequenceGenerator(name = "srm_t_questionnaire_answer_rowguid_seq", sequenceName = "srm_t_questionnaire_answer_rowguid_seq", allocationSize = 1)
    @Column(name="rowguid")
    private Long rowguid;

    @OneToMany(mappedBy = "answer", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<SrmQsQuestionnaireAnswerValueVOImpl> answerValue;
}

@Entity
@Table(name = "srm_t_questionnaire_answer_value")
@IdClass(SrmQsQuestionnaireAnswerValueVOImplId.class)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class SrmQsQuestionnaireAnswerValueVOImpl extends AbstractBasePropertiesImpl implements SrmQsQuestionnaireAnswerValueVO {

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="fk_answer_id")
    private SrmQsQuestionnaireAnswerVOImpl answer;

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="fk_option_id")
    private SrmQsQuestionOptionVOImpl option;
}

当我试图从answer_value表中删除作为外键引用的answer表中的一行时,我得到错误:

var answer = new SrmQsQuestionnaireAnswerVOImpl();
answer.setRowguid(1L);
answerService.getObjectDAO().delete(answer);

错误:对表“srm_t_questionnaire_answer”的更新或删除违反了对表“srm_t_questionnaire_answer_value”的外键约束“srm_t_questionnaire_answer_value_fk”
当然,在删除答案之前,Hibernate应该先检查是否存在具有该特定ID的answer_values,然后删除它们。但显然这不会发生。

**编辑:**当我尝试通过findById在删除之前加载实体时,我得到了这个错误,我不完全确定它来自哪里:

原因:java.lang.IllegalArgumentException:无法将com.cl.myapp.srm.qs.business.impl. SrmQsQuestionnaire VOImpl字段com.cl.myapp.srm.qs.business.impl. SrmQsQuestionnaire AnswerVOImpl.question设置为com.cl.myapp.srm.qs.business.impl.SrmQsQuestionnaire VOImpl$HibernateProxy$lkSYS8mN

5t7ly7z5

5t7ly7z51#

代码中的问题是,您只是创建了实体的新示例,而不是从数据库中阅读它。这就是JPA无法正确删除它的原因。尝试类似于以下内容:

Answer answer = service.findById(1L);
service.delete(answer);

**上次编辑后:**看起来你有更多的实体,而不是你显示的代码。错误来自另一个实体SrmQsQuestionVOImpl。我建议仔细分析你的数据结构和数据库中的当前数据。例如,对于关系的一个表中的每个FK,另一个表中必须存在与此PK对应的条目。否则,直接在数据库中删除FK。

相关问题