草庐IT

java - JPA JPQL 是从数据库还是从持久性上下文中选择查询读取?

coder 2023-10-18 原文

对于 id=1 的文档,我有文档实体和一些托管文档对象。

 Document managedDoc = entityManager.find(Document .class, 1);
 managedDoc.setName("changedName");

据我所知,在调用 setter 之后,托管文档状态在持久上下文(进一步的 PC)中发生了变化,但数据库中没有任何变化。在我的代码中的某处,我执行以下操作:

 Query query = entityManager.createQuery("from Document");
 List<Document> list = query.getResultList();
 return list;

当我执行如上所示的全选查询时,id=1 的文档是从数据库还是从 PC 获取的? 从 DB 意味着选择将看不到新名称,因为新名称仍在 PC 中。

实际上,我的问题是通过 merge() 和 flush() 进行更新并进一步检索所有对象 - 目前我的全选查询没有看到某些字段的新值。看起来 merge+flush 没问题,但是 JPA 查询不是从 DB 而是从 PC 读取的。但即使我是对的,PC 和 DB 都包含名称的新值,为什么我的 select-all 看不到它?

此外,全选sometimes returns correct/updated values, sometimes not

更新

澄清:

  1. 我通过 entityManager.find(Document .class, 1);
  2. 将一些对象放到 PC 上
  3. 我创建了新的分离实例,并设置了一些名称属性。 Id 和其他 Prop 从托管实例中获取。例如, managedDoc = getFromSomeDataStructure(); 文档 nonManaged = new Document(managedDoc.getId()); nonManaged.setName("newName");
  4. 我通过 em.merge(nonManaged);flush();
  5. 更新数据库
  6. 在 Workbench 中检查数据库时,我看到了我在数据库中所做的更改。
  7. 我正在按 F5(甚至 CTRL+F5)按钮执行全选 JPQL 查询,在每个奇数按钮上按下==全选查询我看到非实际的旧值,在每个偶数按钮上按下==全选查询我看到了正确的值。

最佳答案

它将从持久上下文中获取,只要它有它们。更正确地说:只要您有一个处于托管状态的实体(即在持久性上下文中),它就不会被覆盖。当然,在使用相同 EntityManager 实例的上下文中。

如果你想从数据库中重新获取值,你有不同的可能性:

  1. 在不同的事务中使用另一个 EntityManager(重要!)。
  2. 使用EntityManager.detach()或者,如果您想清除整个持久性上下文,请使用 EntityManager.clear()
  3. 使用EntityManager.refresh()丢弃对实体实例所做的所有更改。

关于java - JPA JPQL 是从数据库还是从持久性上下文中选择查询读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28579528/

有关java - JPA JPQL 是从数据库还是从持久性上下文中选择查询读取?的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐