- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 JPA。我的提供商是 EclipseLink,我正在制作桌面应用程序,并使用应用程序管理的 EntityManager。在数据库中,我有表 B 引用表 A,这意味着实体类 A 具有 B 列表(并且它还有一些其他列表)。这是简化的情况:我有四种方法/场景可以使下面的方法所做的更改在调用方法中可见,这就是 EM。
void addB(A a, String desc){
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
mngedA = em.find(A.class, a.getId());
B b = new B();
b.setDesc(desc);
// option 1:
b.setA(mngedA);
em.persist(b);
// option 2:
a.getBList().add(b);
em.getTransaction.commit();
em.refresh(a); //needed in some scenarios
em.close();
}
在调用方法中我有这个:
em = factory.createEntityManager();
A a = em.find(A.class, id);
println(a.getBList().size());
addB(a, "value1");
//em = factory.createEntityManager(); //1
//a = em.find(A.class, id); //2
//em.refresh(a); //3
println(a.getBList().size());
标记的行可以被注释和取消注释,我想出了 4 种组合,使第二个 println 调用打印比第一个更大的数字。这些是:
在addB中使用选项1(直接持久化新实体),在addB中使用刷新。在调用方法中仅使用 a = em.find...(用 1 和 3 标记的注释行)。
在addB中使用选项1,但仅在调用方法中使用刷新(取消注释行//3,保留行//2注释)。
在 addB 中使用选项 1,但不在 addB 中使用刷新,在调用方法中使用刷新,并使用 new em 再次“查找”A(取消所有 3 行注释)。 (几乎与 2 相同,但由于性能而有趣)
在addB中使用选项2,完全不使用刷新,取消调用方法中所有3行的注释。
第一个组合是最慢的,它需要最多的 SQL 查询。刷新时它会加载所有内容。第二个和第三个组合位于中间,刷新时它仅加载数据库中的更改。第四个示例是最快的,它不需要对数据库进行任何额外的查询。
有人可以对所有这些困惑发表评论吗,这是如何以及为什么有效?
正确的方法是什么?有没有办法在不创建新的 EM 的情况下,使用现有的 EM 来实现第四种组合的效果?
如果我想制作大型且复杂的桌面应用程序,可能可以并发访问数据库,我应该采用什么方法?
谢谢。
最佳答案
如果您必须使用不同的 EntityManager 上下文,请记住在其外部加载的实体并不属于它的一部分,因此对 mngedA 所做的更改不会反射(reflect)到 A 中,除非您在事务完成后强制刷新。 EntityManager 的设计用途与事务范围类似,因此单独的 EntityManager 有意彼此隔离。
有很多解决方案可以满足您的需求,但如果您的客户端生命周期很长,您可能不想在其生命周期中保留单个 EM,因为它确实包含一个会被填满并变得过时的缓存。相反,您可能希望根据需要获取一个用于读取,并在完成后将其清除,或者将其丢弃并根据需要获取新的。像这样的东西:
A saveAndAddB(A a, String desc){
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
mngedA = em.merge(a);
B b = new B();
b.setDesc(desc);
b.setA(mngedA);
mngedA.getBList().add(b);;
em.persist(b);
em.getTransaction.commit();
em.close();
return mngedA;
}
这将保存对 A 的任何更改,并从最新的 EntityManager 返回最新副本。如果需要,您的应用程序将继续使用此 A 实例:
em = factory.createEntityManager();
A a = em.find(A.class, id);
em.close();//no longer needed
println(a.getBList().size());
a = addB(a, "value1");
println(a.getBList().size());
如果您的流程生命周期较短,另一种方法是将 EM 传递到方法中,以便可以在同一事务中获取所有更改,但更常见的是传递分离的 A 实例并将它们合并到事务中,如下所示必需的。如果您不想接受对 A 的更改,则可以将 A 的 ID 传递给 addB 方法。
关于java - JPA - 跨 EntityManager 获取更新/同步的实体(刷新),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27881058/
都是整数,但一直报错 "Only assignment, call, increment, decrement, await, and new object expressions can be us
我有以下情况:一个“对话”实体/表,它有多个关联的标签。Tag 也是一个实体/表 - key/id 是 tagName(一个字符串)。 在客户端 (javascript),我在处理标签时使用字符串数组
我想通过 maven java 源代码生成器自动生成 java 源代码。我想通过查看一个大实体 xml 文件来创建实体类,该文件将包含系统中的所有实体和实体关系。据我搜索,目前maven中没有这样的插
我有一段时间有这个疑问,有人说 EJB 3.0 中没有所谓的实体 bean。有没有可能这样说,EJB 3.0 使用 JPA 来持久化数据并且没有对以前版本(EJB 2.1)中的实体 bean 进行增强
我观看了关于 Core Data 的 2016 WWDC 视频并查看了各种教程。我见过使用 Core Data Framework 创建对象以持久保存到 managedObjectContext 中的
实体(entites) 用于定义引用普通文本或特殊字符的快捷方式的变量,可在内部或外部进行声明 实体引用是对实体的引用 声明一个内部实体 语法: <!ENTITY 实体名称 "
This page建议 !ENTITY: If you want to avoid duplication, consider using XML entities (for example, [ ]
我正在努力解决这个问题:如何判断一个概念是聚合根还是只是一个实体(属于 AR 的一部分)? : 他们都有 ID 它们都是由实体或值对象组成 也许如果我需要引用其他 AR 中的实体,那么我需要将其设为
我使用 Symfony2 和 Doctrine,我有一个关于实体的问题。 出于性能方面的考虑,我想知道是否可以在不进行所有关联的情况下使用实体? 目前,我还没有找到另一种方法来创建继承带有关联的类的模
我已经尝试在 HTML 中包含以下代码,用于附加文件符号。但它显示一个空的白框。 📎 📎 📎 是否有替代的 HTML 附加文件符号实体? 如果没有,我们可以手动创建
我在 grails 中有一个域类......我如何让 gorm 在创建数据库时忽略这个实体?就别管它了。 最佳答案 如果我理解,你不想从域类创建表?如果是,请在域类中使用此代码: static map
我正在努力解决这个问题:如何判断一个概念是聚合根还是只是一个实体(属于 AR 的一部分)? : 他们都有 ID 它们都是由实体或值对象组成 也许如果我需要引用其他 AR 中的实体,那么我需要将其设为
我已经尝试在 HTML 中包含以下代码,用于附加文件符号。但它显示一个空的白框。 📎 📎 📎 是否有替代的 HTML 附加文件符号实体? 如果没有,我们可以手动创建
如何在我的实体中以 14-04-2017 格式存储日期? 但我必须从字符串中解析它。 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-
我需要从两个连接表中获取数据。数据集是什么类型?我是否需要创建一个包含这两个表中的属性的类以用于数据集类型,或者我可以使用实体模式中的类型。我如何修改我的方法才能正常工作? public static
好的,我们正在尝试建立一个中央站点来查看来自销售我们产品的多个供应商的数据。这些多个供应商使用不同的销售系统(确切地说是两个不同的系统),因此每个数据库看起来完全不同。我们与他们的数据库同步,因此数据
我是 backbone 的新手。但是当我研究模型实体时,我不明白一些事情。如果我们可以像 java 或 C# 这样的标准语言一样定义模型属性,那就太好了。有没有可能是这样的。所以我的想法是这样的: M
我想获取存储在可绘制的 xml 文件中的形状的颜色。 我来到了将 Drawable 存储在 Drawable 变量中的步骤,所以,现在我想获取形状的颜色(纯色标签)。 有什么建议吗? 最佳答案 Gra
实体是直接映射到我们的数据库(我们用于 Hibernate)的类。 在调用 DAO 之前,我们的服务类包含这些实体的业务逻辑。 我们还有命令对象,它们是与特定 View 相关的 POJO。有人告诉我实
在我的应用程序中,我需要显示不同存储过程返回的记录列表。每个存储过程返回不同类型的记录(即列数和列类型不同)。 我最初的想法是为每种类型的记录创建一个类,并创建一个函数来执行相应的存储过程并返回 Li
我是一名优秀的程序员,十分优秀!