【问题标题】:EntityManager doesn't refresh the data after queryingEntityManager 查询后不刷新数据
【发布时间】:2011-07-14 19:14:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: jpa jpa-2.0 hsqldb entitymanager


    【解决方案1】:

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

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

    也就是说,contactInfo 的删除不会持久化。

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

    【讨论】:

    • 看起来他不希望它被删除,因为他已经取消了实际删除,但他想知道为什么下次他查询数据库时该项目没有放回集合中。跨度>
    【解决方案2】:

    与其再次查询,不如试试这个:

    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-08-15
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      相关资源
      最近更新 更多