【发布时间】: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