当前位置: 首页 > 知识库问答 >
问题:

Hibernate:插入问题-未找到父密钥

饶谦
2023-03-14

我面临将实体插入数据库的问题。我正在使用HibernateJPA。以下是我的数据库结构:

Table : User {CGU_USER_ID as PK}
Table : Industries {CGI_INDUSTRY_ID (PK),CGI_INDUSTRY_NAME}
Table : USER_INDUSTRY_MAP {CUIM_USER_ID (FK),CUIM_INDUSTRY_ID (FK)}

以下是我的映射:

@JoinTable(name = "USER_INDUSTRY_MAP", joinColumns = @JoinColumn(name = "CUIM_USER_ID", referencedColumnName = "CGU_USER_ID"), inverseJoinColumns = @JoinColumn(name = "CUIM_INDUSTRY_ID"))
@OneToMany(cascade = { CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER)
private List<Industry> industrySet;

我得到的例外情况是:

org.springframework.dao.DataIntegrityViolationException: could not insert collection: [com.keff.gg.domain.User.industrySet#1242]; SQL [insert into CG_USER_INDUSTRY_MAP (CUIM_USER_ID, CUIM_INDUSTRY_ID) values (?, ?)]; constraint [CUSTOMERGATEWAY.FK_CUIM_USER_ID]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert collection: [com.keff.gg.domain.User.industrySet#1242]

Caused by: java.sql.SQLException: ORA-02291: integrity constraint (CUSTOMERPROJECT.FK_CUIM_USER_ID) violated - parent key not found

这是我的插入代码:

User user = new User();
query = session.createQuery("from Industry industry where industry.industryName=:industryName");
        query.setParameter("industryName", "validIndstry");
        results = (List<?>) query.list();
        if(results != null && results.size()>0){
            industryList = (List<Industry>)results;
        }
user.setIndustrySet(industryList); // If this is set to null then insert into User table is successfull
Long id = (Long) hibernateTemplate.save(user);

有人能看看我的映射并告诉我我做错了什么吗。请帮帮我。我刚开始冬眠。如果需要更多信息来追踪问题,请告诉我。

更新-------------------------------------------------------------------我试着让这种关系多对多、双向

//User Class
@JoinTable(name = "CG_USER_INDUSTRY_MAP", joinColumns = @JoinColumn(name = "CUIM_USER_ID", referencedColumnName = "CGU_USER_ID"), inverseJoinColumns = @JoinColumn(name = "CUIM_INDUSTRY_ID"))
@ManyToMany(cascade = { CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER)
private List<Industry> industrySet;

//Industry Class
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "industrySet")
private List<User> userSet;

但还是有同样的问题。

共有2个答案

仰翰采
2023-03-14

因为您使用的是持久化操作,所以请确保在映射上具有级联选项。您可以添加级联类型。坚持使用您的坚持选项以使其正常工作。

@OneToMany(cascade = {  CascadeType.MERGE, CascadeType.REMOVE ,CascadeType.PERSIST })
@JoinTable(name = "USER_INDUSTRY_MAP", joinColumns = { @JoinColumn(name = "CUIM_USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "CUIM_INDUSTRY_ID") })
private List<Industry> industries = new ArrayList<Industry>();

您甚至可以使用CascadeType。ALL指定关联的所有操作都应该级联。

蔺劲
2023-03-14

我找到了我面临的问题的根源。

User表上有一个触发器,它在每次插入后更新User序列。我想这就是问题的原因。我可以看到,禁用触发器后,我能够正确保存用户实体,没有任何问题。

谢谢大家抽出时间。

 类似资料:
  • 我面临错误:ORA-02291:完整性约束-调用时未找到违反描述符的父密钥。JpaRepository中的saveAll() 我的数据库是Oracle 18c 我在下面有两个表 我的实体代码: 我的java代码: Hibernate日志 我怎样才能解决这个问题?

  • 我知道,为了在依赖外键的表中插入值,您需要在该表的主键中包含数据。 以下是我的限制: 接下来,我在profs和courses表中插入值: 然后我尝试填充DIDACT表: 但这种情况会发生: 插入didact值('p1','21')错误报告-SQL错误:ORA-02291:违反完整性约束(user.ID\u COURSE\u FK)-未找到父项02291。00000-“违反完整性约束(%s.%s)-

  • 杰米特。我在系统中设置了jks的路径和密码。财产。我执行一个HTTP请求,在日志中看到一个错误: 和 日志:

  • 我得到了“完整性约束(SYSTEM。FK_FACILITY)违反了父密钥未找到”错误,尽管主键在上一个表中已经明确定义。 我的确切错误是 我只想将值添加到表中,但我无法这样做。。。如果有人能帮我,那就太好了!

  • 当我将数据插入到分配表中时,除了硬件和软件值,它们的编码方式与其他值完全相同,其他值都可以正常工作。我就是不明白。 这项工作: 但是,当我尝试包括硬件或软件的值时,例如: 我只得到以下错误:SQL错误:ORA-02291:完整性约束(JAS1224。SYS_C0028418)违反-找不到父密钥02291. 00000-"完整性约束(%s.%s)违反-找不到父密钥"*原因:外键值没有匹配的主键值。*