我有两个实体类A和B,它们分别以双向一对多关系存在.
A.java:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "aId",
fetch=FetchType.EAGER, orphanRemoval=true)
private Set<B> bCollection = new LinkedHashSet<B>();
Run Code Online (Sandbox Code Playgroud)
B.java
@JoinColumn(name = "A_ID", referencedColumnName = "ID", nullable=false)
@ManyToOne(optional = false)
private A aId;
Run Code Online (Sandbox Code Playgroud)
在一个简单的控制台应用程序中,我从数据库中获取一个特定的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();
}
Run Code Online (Sandbox Code Playgroud)
JPA不管理你的关系,所以当你在b上调用remove时,仍然有一个对它的引用.由于引用上有一个级联持久化/合并集,它会导致b在上下文中复活,撤消删除.
您必须维护引用以使模型与数据库中的内容保持同步.除非您确定可以处理潜在的不一致性,否则最好将对要删除的对象的引用置空并设置回指针.
| 归档时间: |
|
| 查看次数: |
5670 次 |
| 最近记录: |