我有两个分别以双向一对多关系存在的实体类 A 和 B。
A.java:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "aId", fetch=FetchType.EAGER, orphanRemoval=true) private Set<B> bCollection = new LinkedHashSet<B>();
B.java
@JoinColumn(name = "A_ID", referencedColumnName = "ID", nullable=false) @ManyToOne(optional = false) private A aId;
在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应的实体。因此,尽管有解决方法,但我想了解为什么以下代码会失败,并且也会悄然失败! *
public static void main(String[] args) { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("testjpa"); EntityManager em = entityManagerFactory.createEntityManager(); EntityTransaction entityTransaction = em.getTransaction(); entityTransaction.begin(); A a = em.find(A.class, 1); B b = getARandomChildOfA(a); em.remove(em.merge(b)); // simple em.remove(b) doesn't work either entityTransaction.commit(); em.close(); entityManagerFactory.close(); }
JPA不会为您管理关系,因此当您在b上调用remove时,a仍然引用了它。由于引用上具有级联的持久/合并设置,因此它将导致b在上下文中重新出现,从而撤消删除操作。
您必须维护引用,以使模型与数据库中所需的模型保持同步。除非您确定可以解决此类潜在的不一致问题,否则最好取消对要删除的对象的引用并设置指针。