Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa EntityManager没有';查询后不刷新数据_Jpa_Jpa 2.0_Hsqldb_Entitymanager - Fatal编程技术网

Jpa EntityManager没有';查询后不刷新数据

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()的行为,在其 清除

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

场景是:我查询DB以获取
人员的
联系人详细信息的列表。我在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();

看起来他不想删除它,因为他已经取消了实际的删除,但他想知道为什么下次他查询数据库时,该项目没有放回集合中。