【问题标题】:Hibernate: Insert issue - Parent Key not found休眠:插入问题 - 找不到父键
【发布时间】:2016-06-08 16:13:26
【问题描述】:

我在将实体插入数据库时​​遇到问题。我正在使用休眠 JPA。 这是我的数据库结构:

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;

但仍然遇到同样的问题。

【问题讨论】:

  • 为什么会有@OneToMany关系和@ManyToMany关系常用的关系表?
  • 您好伊万,感谢您的快速回复。我知道应该只有两张表,其中 Industries 持有用户的 FK。我不确定为什么数据库设计是这样的。但我将无法改变这一点。不应该这样工作吗?
  • 映射没问题。这实际上是 OneToMany 单向关联的默认映射方式。
  • 尝试先保存用户,然后设置其行业集合。另外,所有这些行业都没有被任何其他用户引用吗?因为如果它们是,那么它是一个多对多关联,而不是一个单对多。
  • 谢谢 Nizet,我试过这样做。但我仍然遇到同样的问题。我也建立了多对多的关系。仍然没有收获。任何其他指针都会很有帮助。

标签: hibernate


【解决方案1】:

我找到了我所面临问题的根本原因。

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

感谢大家的宝贵时间。

【讨论】:

  • 谢谢这也是我的问题的原因,我不知道我的共同开发者添加了一个触发器。
【解决方案2】:

因为您使用的是持久化操作,请确保您的映射具有级联选项。您可以将 CascadeType.PERSIST 添加到您的持久选项中以使其正常工作。

@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 来指定所有操作应为关联级联。

【讨论】:

  • 感谢您的回复。但这并没有帮助。我仍然遇到同样的问题。
猜你喜欢
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多