【问题标题】:How do I make JPA merge insert new child objects for a OneToMany relationship如何让 JPA 合并为 OneToMany 关系插入新的子对象
【发布时间】:2015-05-27 18:41:26
【问题描述】:

当有新的子对象时,我无法让我的合并向下级联。 我有一个带有一组子对象的父对象(城市)

@OneToMany(mappedBy = "parent", cascade = { CascadeType.ALL }, fetch=FetchType.LAZY )
public Set<Street> getStreets() {
    return streets;
}

还有一个引用父对象的子对象(街道)

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="City", nullable=false)
public City getParentCity(){
    return parentCity;
}

我每天都在运行一个例程,将信息转储到数据库中。一切都很好,直到 JPA 跑到一条新街上。当它给我一个EntityNotFoundException。我假设这意味着数据库中没有具有新 ID 的街道。从我读过的内容来看,这是因为孩子是事务的实际所有者,但如果它遇到这个“EntityNotFound”异常,我需要它来持久化新对象

我没有使用自动生成的主键,它是数据集中已经存在的键。目前我可以访问在父对象上使用 em.merge() 的微服务。

我看到有一个选项可以删除不再存在的对象(orphanRemoval);有没有办法添加新的?

谢谢

【问题讨论】:

  • 这取决于您如何尝试保存或合并集合和父级。由于您有双向映射,因此您需要有双向关联,例如parent.getChildren().add(newChild); 和 newChild.setParent(parent);`
  • 目前我只是在父对象上调用 em.merge() 。有没有办法让实体经理自动处理这个问题?就像它如何对待孤儿一样?
  • 这个链接可能对你有点帮助。 blog.xebia.com/2009/03/23/…
  • 抱歉误解,merge() 会插入(如果需要)。在您的情况下,@Id 是自动生成的还是分配的?如果它没有被分配,那么它将假定对象在那里并尝试更新。 objectdb.com/database/forum/307
  • @RP - 我看到的行为是 merge() not 根据需要插入。它不是插入,而是抛出一个 EntityNotFoundException。 @Id 是从传入数据集中填充的,并在合并前分配。你是说如果@Id 是自动生成的,它会尝试更新吗?如果它不知道要更新的记录的 ID,它会尝试更新什么?

标签: java hibernate jpa one-to-many many-to-one


【解决方案1】:

我不知道是不是这样,但对我来说,只有当我将 hibernate 的注释放在变量属性本身之上时才有效,而不是在 getter 方法上。

【讨论】:

    【解决方案2】:

    对我有用的是“手动”首先拯救街道,然后是城市。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多