我认为我认为EclipseLink中的一个相当典型的设置,虽然我承认我对EclipseLink有点新鲜。我曾经使用过Persistence和Hibernate,但通常是通过一些方便的包装器等而不是像我这里那样直接。持久化类A包含持久化类B的列表。它的注释如下:
public class A {
@OneToMany(fetch = FetchType.EAGER, targetEntity = B.class, cascade = CascadeType.ALL, mappedBy = "fieldA")
@PrivateOwned
@CascadeOnDelete
private List<B> bItems;
}
public class B {
@ManyToOne(targetEntity = A.class, fetch = FetchType.EAGER)
@JoinColumn(name = "JOIN_COL")
private A aItem;
}
这些对象的创建和编辑工作正常。当一个对象A被删除时,它会按原样级联,并且任何绑定它的B对象也会被清除。我正在尝试的问题是试图直接从A清除B对象。通常,这是通过UI与一些中间DTO对象之间完成的。这工作正常。但是,我有一些后端代码需要在某些情况下直接从域对象A中清除所有对象B.似乎使用:
itemA.getBItems().clear();
无效。我认为这应该由EntityManager(在服务类中使用简单的entityManager.persist(objectA)
完成)来获取,但它不会清除数据库中的关联B对象。这只是我正在做的方式的性质,甚至是ArrayList类实现clear()的方式(我尝试了一些其他方法,但在这种情况下,野兽的性质使得它很难和耗时。正确测试),或者我是否需要在如何做到这一点上更细致?也许我的注释有点过了?或者我可能正确地做事但需要在服务类中添加一个方便的方法,通过EntityManager清除B对象并驱逐任何相关的缓存?