我正在使用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
1条答案
按热度按时间5t7ly7z51#
代码中的问题是,您只是创建了实体的新示例,而不是从数据库中阅读它。这就是JPA无法正确删除它的原因。尝试类似于以下内容:
**上次编辑后:**看起来你有更多的实体,而不是你显示的代码。错误来自另一个实体SrmQsQuestionVOImpl。我建议仔细分析你的数据结构和数据库中的当前数据。例如,对于关系的一个表中的每个FK,另一个表中必须存在与此PK对应的条目。否则,直接在数据库中删除FK。