5

我当前的项目使用 HSQLDB2.0 和 JPA2.0 。

场景是:我查询数据库以获取contactDetails. person我在 UI 中删除了单个contactInfo但不保存该数据(Cancel保存部分)。

我再次执行相同的查询,现在结果列表比以前的结果少 1,因为我在 UI 中删除了一个 contactInfo。但contactInfo如果我交叉检查,那仍然可以在 DB 获得。

但是如果我entityManager.clear()在查询开始之前包含,我每次都会得到正确的结果。

我不明白这种行为。谁能给我说清楚?

4

2 回答 2

16

而不是再次查询,试试这个:

entityManager.refresh(person);

一个更完整的例子:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("...");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();

Person p = (Person) em.find(Person.class, 1);
assertEquals(10, p.getContactDetails().size()); // let's pretend p has 10 contact details
p.getContactDetails().remove(0);
assertEquals(9, p.getContactDetails().size());

Person p2 = (Person) em.find(Person.class, 1);
assertTrue(p == p2); // We're in the same persistence context so p == p2
assertEquals(9, p.getContactDetails().size());

// In order to reload the actual patients from the database, refresh the entity
em.refresh(p);
assertTrue(p == p2);
assertEquals(10, p.getContactDetails().size());
assertEquals(10, p2.getContactDetails().size());

em.getTransaction().commit();
em.close();
factory.close();
于 2011-03-14T12:04:29.417 回答
2

的行为clear()在其javadoc 中进行了解释:

清除持久性上下文,导致所有托管实体分离。对尚未刷新到数据库的实体所做的更改将不会被持久化。

也就是说,删除contactInfo不会持续存在。

ContactInfoContactDetails没有从数据库中删除,因为您删除了and之间的关系ContactInfo,而不是ContactInfo它本身。如果要删除它,则需要明确地使用remove()或指定orphanRemoval = true关系。

于 2011-03-14T07:06:49.960 回答