我正在我的项目的服务器端开发一个逻辑,它将更新数据库中的实体。但是这个实体引用了另一个实体的列表。
所以,例如,我有一个像这样的实体Test
:
@Entity
public class Test {
@Id
@Column(name = "idTest", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@OneToMany(mappedBy = "idTest", targetEntity = Test2.class, fetch = FetchType.LAZY)
private Collection<Test2> test2Collection;
}
引用了Test2
实体。
@Entity
public class Test2 {
@Id
@Column(name = "idTest2", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String field1;
private String field2;
@ManyToOne
@JoinColumn(name = "idTest", referencedColumnName = "idTest")
private Test idTest;
}
在我的情况下,我正在更新test2Collection
条目的集合Test
,最终我正在删除它的一些Test2
条目。
来自merge
的简单EntityManager
方法在我调用它时通过新更新的Test
条目时未检测到某些条目已被删除。
我想通过在更新数据库之前在test2Collection
条目之间进行差异并使用要更新的新Test
条目来跟踪Test
中已删除的条目。
但我不确定这是唯一(也是最好的)这样做的方式。其他人有另一个想法吗?
答案 0 :(得分:2)
在您的关系中,您必须添加orphanRemoval,然后如果删除集合中的一个元素并持久化Test,则集合中删除的元素将自动删除Test2表。
@OneToMany(orphanRemoval = true, mappedBy = "idTest", targetEntity = Test2.class, fetch = FetchType.LAZY)
private Collection<Test2> test2Collection;