Jpa EntityManager没有';查询后不刷新数据
我当前的项目使用HSQLDB2.0和JPA2.0 场景是:我查询DB以获取Jpa EntityManager没有';查询后不刷新数据,jpa,jpa-2.0,hsqldb,entitymanager,Jpa,Jpa 2.0,Hsqldb,Entitymanager,我当前的项目使用HSQLDB2.0和JPA2.0 场景是:我查询DB以获取人员的联系人详细信息的列表。我在UI上删除单个contactInfo,但不保存该数据(取消保存部分) 我再次做同样的查询,现在的结果列表比之前的结果少1个,因为我在UI上删除了一个contactInfo。但是,如果我进行交叉检查,数据库中的联系人信息仍然可用 但如果在开始查询之前包含entityManager.clear(),每次都会得到正确的结果 我不理解这种行为。有人能给我讲清楚吗?关于clear()的行为,在其 清除
人员的联系人详细信息的列表。我在UI上删除单个contactInfo
,但不保存该数据(取消保存部分)
我再次做同样的查询,现在的结果列表比之前的结果少1个,因为我在UI上删除了一个contactInfo。但是,如果我进行交叉检查,数据库中的联系人信息仍然可用
但如果在开始查询之前包含entityManager.clear()
,每次都会得到正确的结果
我不理解这种行为。有人能给我讲清楚吗?关于clear()
的行为,在其
清除持久性上下文,使所有托管实体分离对尚未刷新到数据库的实体所做的更改将不会持久化。
也就是说,contactInfo
的删除不会持久化
ContactInfo
不会从数据库中删除,因为您删除了ContactDetails
和ContactInfo
之间的关系,而不是ContactInfo
本身。如果要删除它,您需要使用remove()
显式执行,或者在关系上指定orphandremovation=true
。而不是再次查询,请尝试以下操作:
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();
看起来他不想删除它,因为他已经取消了实际的删除,但他想知道为什么下次他查询数据库时,该项目没有放回集合中。