查询后,EntityManager不刷新数据

时间:2011-03-14 06:19:25

标签: jpa jpa-2.0 hsqldb entitymanager

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

方案是:我查询数据库以获取contactDetails person的列表。我在UI处删除单个contactInfo但不保存该数据(取消保存部分)。

我再次执行相同的查询,现在结果列表比先前的结果小1,因为我在UI处删除了一个contactInfo。但如果我交叉检查,那么contactInfo仍然可用于数据库。

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

我不明白这种行为。有人能说清楚吗?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

clear()

解释了contactInfo的行为
  

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

即,ContactInfo的删除不会保留。

ContactDetails未从数据库中删除,因为您删除了ContactInfoContactInfo之间的关系,而不是remove()本身之间的关系。如果要删除它,则需要使用orphanRemoval = true明确删除,或者在关系中指定{{1}}。