gpt4 book ai didi

java - 将更新查询与 objectdb 一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:53 34 4
gpt4 key购买 nike

以下代码:

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("test.odb");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Point p = new Point(0, 0);
em.persist(p);
em.getTransaction().commit();
em.getTransaction().begin();
Query query = em.createQuery("UPDATE Point SET x = 1001 where x = 0");
int updateCount = query.executeUpdate();
em.getTransaction().commit();
TypedQuery<Point> myquery = em.createQuery("SELECT p from Point p where p.x = 1001", Point.class);
List<Point> results = myquery.getResultList();
System.out.println("X coordinate is: " + results.get(0).getX());
em.close();

打印出:X坐标为:0这是错误的,因为 X 坐标应该是 1001

但是如果我将代码更改为:

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("test.odb");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Point p = new Point(0, 0);
em.persist(p);
em.getTransaction().commit();
em.getTransaction().begin();
Query query = em.createQuery("UPDATE Point SET x = 1001 where x = 0");
int updateCount = query.executeUpdate();
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
TypedQuery<Point> myquery = em.createQuery("SELECT p from Point p where p.x = 1001", Point.class);
List<Point> results = myquery.getResultList();
System.out.println("X coordinate is: " + results.get(0).getX());
em.close();

结果与预期相同:

X 坐标为:1001

我在第一个代码片段中做错了什么?

最佳答案

UPDATE 查询绕过 EntityManager,这意味着 EntityManager 可能没有数据库中真实对象的最新 View 。

UPDATE queries page 中所述在 ObjectDB 手册中:

“使用 UPDATE 查询更新数据库中的实体对象可能比检索实体对象然后更新它们稍微更有效,但应谨慎使用,因为绕过 EntityManager 可能会破坏其与数据库的同步。例如,EntityManager 可能不知道其持久性上下文中的缓存实体对象已被 UPDATE 查询修改。因此,最好使用单独的 EntityManager 进行 UPDATE 查询。”

使用单独的 EntityManager 正是您在修订后的代码中关闭并打开新的 EntityManager 所做的事情。

或者,如果您想使用相同的 EntityManager,您可以 clear its persistence context (即它的缓存),在运行 UPDATE 查询之后和运行 SELECT 查询之前。

关于java - 将更新查询与 objectdb 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23213368/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com