为什么我们必须手动刷新()扩展 PersistenceContext 中的 EntityManager?

2024-01-01

在我们的 J2EE 应用程序中,我们使用 EJB-3 有状态 bean 来允许前端代码创建、修改和保存持久实体(通过 JPA-2 管理)。

它看起来像这样:

@LocalBean
@Stateful
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEntityController implements Serializable
{   
    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private EntityManager em;

    private MyEntity current;

    public void create()
    {
        this.current = new MyEntity();
        em.persist(this.current);
    }

    public void load(Long id)
    {
        this.current = em.find(MyEntity.class, id);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void save()
    {
        em.flush();
    }
}

非常重要,为了避免过早提交,只有save()方法在事务内,所以如果我们调用create(),我们在数据库中不插入任何内容。

奇怪的是,在save()方法,我们必须调用em.flush()才能真正打到数据库。其实我尝试了一下发现我们也可以调用em.isOpen() or em.getFlushMode(),以及任何“与em相关”的东西。

我不明白这一点。作为save()在一个事务中,我认为在方法结束时,事务将被提交,因此持久实体管理器会自动刷新。为什么我必须手动冲洗它?

谢谢, 泽维尔


直接针对金属,不会有javax.transaction.Synchronization为相关 EntityManager 注册的对象,直到您实际use it in一笔交易。

我们在应用程序服务器领域将创建这些对象之一来执行以下操作flush()并将其注册到javax.transaction.TransactionSynchronizationRegistry or javax.transaction.Transaction。除非有活跃的交易,否则无法完成此操作。

这就是它的长处和短处。

是的,应用程序服务器可以很好地保留它提供给有状态 bean 的资源列表,并在有状态 bean 可能启动或参与的每个事务中自动注册它们。这样做的缺点是您完全失去了决定哪些事情该去的能力其中交易。也许您有 2 或 3 个不同的事务要在不同的持久性单元上运行,并且正在为一个非常特定的事务在扩展持久性上下文中聚合工作。这实际上是一个设计问题,应用程序服务器应该将此类决定留给应用程序本身。

您在交易中使用它,我们会将其注册到交易中。这就是基本合同。

旁注,取决于底层 EntityManager 的处理方式,any对 EntityManager 的持久调用may足以在事务结束时导致完全刷新。当然,flush()是最直接、最明确的,但persist()甚至是一个find()可能会做到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们必须手动刷新()扩展 PersistenceContext 中的 EntityManager? 的相关文章

  • 使用 Spring Framework Cloud 时无法将工件从中央 Maven 存储库传输到中央 Maven 存储库

    我正在尝试使用 Spring Framework Cloud 创建一个 Maven 项目 我定义了 pom xml 文件如下
  • 无法解析符号“AuthUI”

    我正在添加 firebase google 和 Gmail 登录 但是当我粘贴代码时 onAuthStateChanged NonNull FirebaseAuth firebaseAuth 方法我收到此错误 无法解析符号 AuthUI 在
  • Java用逗号或点和两个小数值验证价格[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 验证必须用点或逗号表示价格值且最多具有两位小数值的字符串的最佳方法和解决方案是什么 RegExp java text DecimalFor
  • Mockito - 监视真实对象调用原始方法

    想象一下下面的代码 List list List spy spy list doThrow new NullpointerException when spy get 0 doThrow 执行list get 0 这根本没有意义 我想定义模
  • 同步 Set 线程的构造函数副本安全吗?

    获取同步版本的最简单方法java util Set将使用Collections synchronizedSet 像这样 Set mySyncSet Collections synchronizedSet new HashSet The Ja
  • 使用synchronized关键字和lock有什么区别[重复]

    这个问题在这里已经有答案了 Java 5引入了lock方法 与synchronized关键字相比 使用lock有什么优点和缺点 同步 将锁定该方法内访问的任何资源 lock 允许您进行更精细的控制 例如 仅锁定某些资源 或者仅在满足特定条件
  • 从不同 JVM 中的 Java 桌面应用程序中执行 Java main 方法

    我有一个桌面应用程序 当有人按下按钮时 我希望它启动另一个执行类的 main 方法的 JVM 我的桌面应用程序已经依赖于包含具有我想要执行的 main 方法的类的 jar 目前我有以下代码 但是 我希望它们是一种更优雅的方法 Runtime
  • 在 Java 中使用并行性会使程序变慢(慢四倍!!!)

    我正在编写共轭梯度方法实现 我使用 Java 多线程进行矩阵反向替换 使用CyclicBarrier CountDownLatch 进行同步 为什么同步线程需要这么长时间 还有其他方法吗 代码片段 private void syncThre
  • 如何在 JavaFX 中设置滚动窗格的单位增量?

    The 滚动条 http docs oracle com javafx 2 api javafx scene control ScrollBar htmlJavaFX 中的类包含一个用于设置单位增量的属性 这就是我所追求的 但是我找不到如何
  • Java,根据 WSDL 中的嵌入模式验证 XML

    我有一个 wsdl具有嵌入架构的文件 我想使用它来验证 XML 文件 字符串 wsdl文件 与验证的方式相同 xsd 该架构位于
  • hibernate 如何确保二级缓存使用数据库中的最新数据进行更新

    我读到 使用 hibernate 的二级缓存 它可以通过减少数据 对象检索的数据库命中来提高应用程序性能 但是hibernate是如何保证二级缓存与数据库中的数据是最新的呢 例如 假设下面的类是实体并持久化到数据库中 Entity clas
  • 如何生成0-8范围内除一个特定数字之外的随机数?

    我正在尝试开发 Tic Tac Toe 游戏 其中玩家 1 将单击一个按钮放置 X 稍后玩家 2 计算机 将在第一步中随机将 O 放置到其他按钮 为此 我需要创建一个随机数0 8 之间 除了玩家 1 点击的那个之外 我正在使用以下代码来生成
  • Apache James 学习资源 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 该计划是创建一个列表阿帕奇 詹姆斯 http james apache org学习资源 涉及从设置到使用
  • [PersistenceUnit:<名称>]:无法构建EntityManagerFactory

    正如主题所述 我的问题是EntityManagerFactory无法建造 我正在使用 Maven Hibernate 我正在连接到 MySQL 数据库
  • 有人让动物嗅探器插件工作吗?

    maven animal sniffer 插件承诺告诉我我的代码是否有任何对 Java 1 6 或更高版本 API 的引用 这对于我们这些在 MacOSX Snow Leopard 只有官方 1 6 上开发但需要交付到 1 5 环境的人来说
  • FirebaseAuth.getInstance().signOut() 不注销

    我尝试从 firebase 注销用户 但在关闭应用程序并再次打开后 用户仍然处于连接状态 我尝试从 firebase 定期注销用户 但没有解决问题 我想知道是什么导致了这个问题 logout setOnClickListener new V
  • 为数组生成随机索引

    我知道对于普通整数来说这是这样 但是有索引这样的东西吗 Random dice new Random int n dice nextInt 6 System out println n 你是什 么意思 数组索引是普通数字 所以你可以轻松地做
  • 正确检查 FTP 服务器连接

    我在程序开始时打开与 FTP 服务器的连接 在对服务器执行操作之前 我想检查连接是否已成功建立 最简单快速的方式 因此如果连接消失 我将尝试再次连接 我用这段代码来做到这一点 private boolean checkConnection
  • 使用具有透明度的 IndexColorModel 绘制图像

    这是我的问题 我想在基于具有透明度的 IndexColorModel 的 BufferedImage 上应用转换 平移 旋转 剪辑 索引 0 是我的透明像素 索引 1 是黑色 索引 2 是白色 依此类推 源图像 即在转换之前 被实例化如下
  • 从 HashMap 中查找对象键

    我有一个 HashMap 其键作为我自己的对象 键作为 String 的 ArrayList 有没有一种方法可以从映射中获取与另一个对象相同的关键对象 而无需迭代映射 请注意 我的对象已经实现了 equals 和 hashcode 并且它只

随机推荐

  • 错误:对象当前正在其他地方使用。

    我开发了一个应用程序 可以从数码单反相机连续读取图像流 while liveViewExit Create a Memory Stream stream new IntPtr Get the bitmap image from the DS
  • 从 PHP 数组中删除零值

    我有一个像这样的普通数组 Array 0 gt 0 1 gt 150 2 gt 0 3 gt 100 4 gt 0 5 gt 100 6 gt 0 7 gt 100 8 gt 50 9 gt 100 10 gt 0 11 gt 100 12
  • C#中使用AppDomain动态加载和卸载dll

    在我的一个与系统诊断相关的应用程序中 相关的DLL需要在C 中动态加载和卸载 经过一番搜索 我发现单独的 DLL 无法动态加载完整的 AppDomain 所以我必须创建一个 AppDomain 并使用该 DLL 进行动态加载和卸载 但我找不
  • Font Awesome 5 图标无法与 React 一起使用(“找不到图标”错误)

    我正在尝试在我的 React 项目中使用 Font Awesome 5 Pro 我有许可证 并且我已按照API https www npmjs com package fortawesome react fontawesome尽我所能 但我
  • jQuery 获取高度和宽度

    我做了一个if函数检查宽度是否 document ready function var pic pic need to remove these in of case img element has set width and height
  • Django + PostgreSQL 连接 - 无法使用服务器端游标

    我在 PostgreSQL 中有一个存储过程 它返回一个引用游标 它的名称可以作为参数传递 Example stored procedure CREATE OR REPLACE FUNCTION example stored procedu
  • UWP 中的扩展执行

    我想为我的 UWP 应用程序使用后台任务 下面的代码是我在Windows Mobile中的后退按钮单击事件 private async void MainPage BackRequested object sender BackReques
  • 我如何使用 SVN 作为 Maven 存储库

    我正在开发具有多个依赖项的项目 大多数依赖项都可以在我们的集中 Maven 存储库中找到 我的项目包含一些仅特定于我的应用程序且在我们的 Maven 存储库中不可用的 JAR 由于某些政策 限制 我无法将该 jar 部署到我们的 Maven
  • 匹配 XPath 中的不间断空格值

    假设我有这样的 XML 结构 table tr td nbsp td tr table 我将如何指定与谓词中的节点值的比较 tr td 应该指定什么而不是 解决办法是 tr td u0160 实际的 unicode 表示方式取决于您使用的工
  • 在angularjs中为多个部分视图创建单个html视图

    我希望创建一个包含多个标签的 html 文件 这些应该作为单独的单独视图 通常保存在部分文件夹中 然后我希望在路由控制器中指定它们 现在我正在做如下 应用程序 js angular module productapp config rout
  • 如何完成这个 Google Calendar Api v3 - FreeBusy PHP - 示例?

    我想使用 google api v3 freebusy php 来查找我的三个日历的免费 freebusy 信息 但我找不到代码的正确结尾 我想访问 freebusy response 的 日历 忙 值 由于 api 参考中没有示例代码 而
  • 使用 roxygen2 时如何指定加载 S4 方法的顺序

    我已经多次遇到以下问题 假设你有两节课 classA and classB在以下文件中描述classA R the class classA This is a class A blabla section Slots describe i
  • 如何根据指针变量计算数组的大小?

    我有数组指针 内存中的数组 我可以根据数组的指针计算数组的大小吗 我实际上不知道数组在内存中的位置 我只得到指针地址 假设9001 使用该地址我必须计算数组大小 Thanks 不 您无法计算数组的大小 C 中的对象不携带类型信息 因此您必须
  • window.scrollTo 在手机中不起作用

    在我的网页的移动视图上 我可以垂直和水平方向滚动 但这始终从左上角开始 现在我想使用 window scrollTo 或类似的东西将视口设置为我的自定义位置 window scroll 似乎只适用于桌面浏览器 知道我该如何解决这个问题吗 我
  • ESLint 和 Prettier 冲突,无法为代码块禁用 Prettier

    我们的项目使用 Prettier 和 ESLint 通常它们可以很好地协同工作 但我们遇到了两者发生冲突的问题 我不知道为什么 我不知道如何修复它 并且我无法禁用该行的 prettier 因为我收到错误 我们设置的相关部分 prettier
  • Lambda 和 std::function

    我正在努力赶上 C 11 和所有出色的新功能 我有点被 lambda 困住了 这是我能够开始工作的代码 include
  • 用 javascript 替换输入

    大家好 我正在尝试将 text 输入类型替换为 password 它适用于以下代码 function replaceT obj var newO document createElement input newO setAttribute
  • 了解 C 中的函数和指针

    这是一个很简单的问题 但是下面的函数原型是什么意思呢 int square int y size t x size t 的剂量是什么意思 我知道 size t 是一种数据类型 int gt 0 但是我如何阅读它所附的 呢 它是指向 x 的内
  • R:计算指定时间范围内不同类别的数量

    这是一些虚拟数据 user id date category 27 2016 01 01 apple 27 2016 01 03 apple 27 2016 01 05 pear 27 2016 01 07 plum 27 2016 01
  • 为什么我们必须手动刷新()扩展 PersistenceContext 中的 EntityManager?

    在我们的 J2EE 应用程序中 我们使用 EJB 3 有状态 bean 来允许前端代码创建 修改和保存持久实体 通过 JPA 2 管理 它看起来像这样 LocalBean Stateful TransactionAttribute Tran