- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Spring Data 和 Hibernate、CascadeType.ALL
和 orphanRemoval = true
。
问题是,当将子实体从parentX移动到parentY时,如果parentY在parentX之前持久化,Hibernate会从数据库中完全删除子实体。之后, child 仍然存在于内存中的parentY中。如果它被删除并保存了parentY,则会抛出EntityNotFoundException
。
我有一个 SSCE 演示了这一点,如有必要可以将其发布,但这似乎是一个简单的问题。
父实体:
@Entity
public class TestParent implements Serializable {
private static final long serialVersionUID = 3572015072906463953L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TestParent_GENERATOR")
@SequenceGenerator(name = "TestParent_GENERATOR", initialValue = 1, sequenceName = "TestParent_SEQUENCE", allocationSize = 1)
private long id;
private String name;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
@JoinColumn(name = "TestParent_Id")
private Set<TestChild> testChildren = new HashSet<>();
@SuppressWarnings("unused")
private TestParent() {
}
public TestParent(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void addChild(TestChild child) {
this.testChildren.add(child);
}
public void removeChild(TestChild child) {
this.testChildren.remove(child);
}
public TestChild findChild(String childsName) {
for (TestChild testChild : this.testChildren) {
if (testChild.getName().equals(childsName)) {
return testChild;
}
}
return null;
}
}
子实体:
@Entity
public class TestChild implements Serializable {
private static final long serialVersionUID = -1594688339088954284L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TestChild_GENERATOR")
@SequenceGenerator(name = "TestChild_GENERATOR", initialValue = 1, sequenceName = "TestChild_SEQUENCE", allocationSize = 1)
private long id;
private String name;
@SuppressWarnings("unused")
private TestChild() {
}
public TestChild(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
最佳答案
从 Hibernate 角度来看,实体映射不完整,这就是您可能会得到意外结果的原因。最大的罪魁祸首就是orphanRemoval = true
,它在没有使用mappedBy = ...
的情况下就被使用了。尽管 JPA 规范不要求使用 orphanRemoval = true
来指定 mappedBy = ...
,但 Hibernate 无法确定 many
上的实体是否存在。 > 如果未指定 mappedBy = ...
,则一对多关联的一侧实际上是孤立的。
以下映射将纠正该行为:
class TestParent {
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "testParent")
private Set<TestChild> testChildren = new HashSet<TestChild>();
}
class TestChild {
@JoinColumn(name = "TestParent_Id")
@ManyToOne
private TestParent testParent;
}
请注意,@JoinColumn(name = "TestParent_Id")
需要移至@ManyToOne
一侧。
您还需要非常小心 parent 的变更。如果子级留在前一个父级的 children
集合中,则更改不会生效。
我创建了一个sample project演示了有效的 JPA 配置。该项目包含一个模拟以下情况的单元测试:
Child
实例 c
。Parent
实例 a
。子
实例c
被添加/分配给父
实例a
。a
已保存。这会级联到 c
,它也会被保存。Parent
实例 b
。子
实例c
被添加/分配给父
实例b
。b
已保存。这会级联到 c
,它也会被保存。在这种情况下,我们期望执行以下 SQL 查询:
INSERT INTO parent (...) VALUES (...);
INSERT INTO child (...) VALUES (...);
INSERT INTO parent (...) VALUES (...);
UPDATE child SET ...;
如果您将单元测试作为 mvn clean test
运行,您将看到 SQL 查询按预期执行。
关于java - Hibernate删除非孤儿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37704926/
我四处寻找是否有任何合适的方法来处理 CSS3 多列中的寡妇和孤儿,但很失望地发现没有。我自己尝试了 widow 和 orphan 属性,但它们什么也没做。 有人知道使用 CSS3 多列并处理寡妇和孤
从 Blobstore 中删除孤立 blob 的最有效方法是什么? 应用功能和范围: 一个(已登录)用户想要创建一个包含一些常规内容的帖子数据存储区字段(例如姓名、姓氏、评论)和 blob(图像)。
从 Blobstore 中删除孤立 blob 的最有效方法是什么? 应用功能和范围: 一个(已登录)用户想要创建一个包含一些常规内容的帖子数据存储区字段(例如姓名、姓氏、评论)和 blob(图像)。
我可以使用哪种级联类型以及在何处让 Hibernate 在不再有“事物”引用图像时自动删除该图像? (基本上就是 Hibernate 中的垃圾收集) 数据库:事物表-图像表,是多对一的,所以很多事物可
我是一名优秀的程序员,十分优秀!