如何控制 Wicket 表单中的 JPA 持久性?

2024-06-25

我正在使用 JPA 2.0(Hibernate 实现)、Spring 和 Wicket 构建一个应用程序。一切正常,但我担心我的表单行为是基于副作用。

作为第一步,我使用OpenEntityManagerInViewFilter。我的域对象是由LoadableDetachableModel它执行entityManager.find() in its load方法。在我的表格中,我包裹了一个CompoundPropertyModel围绕这个模型来绑定数据字段。

我关心的是表单提交操作。目前我的表单提交通过了结果form.getModelObject()进入一个带有注释的服务方法@Transactional。因为模型内的实体仍然附加到实体管理器,@Transactional注释足以提交更改。

这很好,直到我有多个表单对同一实体进行操作,每个表单都会更改字段的子集。是的,它们可以同时访问。我想到了一些选择,但我想知道我错过的任何想法以及有关管理此问题以实现长期可维护性的建议:

  • 将我的实体分割成与编辑表单相对应的子组件,并创建一个主实体,将它们链接在一起形成一个@OneToOne关系。导致表格设计丑陋,并且以后很难更改表格。
  • 立即分离实体加载的实体LoadableDetachableModel,并在服务层手动合并正确的字段。难以管理延迟加载,可能需要为每个表单提供专门的模型版本以确保加载正确的子实体。
  • 在为表单创建模型时将实体克隆到本地副本,然后在服务层中手动合并正确的字段。需要实现很多复制构造函数/克隆方法。
  • 使用Hibernate的dynamicUpdate仅更新实体已更改字段的选项。导致整个应用程序出现非标准 JPA 行为。在受影响的代码中不可见,并且与 Hibernate 实现紧密相关。

EDIT

显而易见的解决方案是在加载实体(即行)以进行表单绑定时锁定该实体。这将确保拥有锁的请求干净地读取/绑定/写入,而不会在后台发生并发写入。这并不理想,因此您需要权衡潜在的性能问题(并发写入级别)。

除此之外,假设您对属性子组上的“最后写入获胜”感到满意,那么 Hibernate 的“dynamicUpdate”似乎是最明智的解决方案,除非您考虑很快切换 ORM。我觉得很奇怪,JPA 似乎没有提供任何允许您只更新脏字段的东西,并且发现将来很可能会这样做。

补充(我原来的答案)

与此正交的是如何确保当您的模型加载用于表单绑定的实体时打开事务。令人担忧的是,实体属性会在此时更新,并且在事务之外,这会使 JPA 实体处于不确定状态。

正如阿德里安在评论中所说,显而易见的答案是使用传统的每个请求交易过滤器。这保证了请求中的所有操作都发生在单个事务中。然而,它会确实对每个请求使用数据库连接。

有一个更优雅的解决方案,带有代码,here http://faler.wordpress.com/2009/04/30/building-a-more-scalable-open-session-in-view/。该技术是延迟实例化实体管理器,并仅在需要时(即,当第一次 EntityModel.getObject() 调用发生时)才开始事务。如果在请求周期结束时有一个事务打开,则该事务将被提交。这样做的好处是永远不会浪费任何数据库连接。

给出的实现使用 wicket RequestCycle 对象(请注意,这在 v1.5 及以后版本中略有不同),但整个实现实际上相当通用,因此您可以通过 servlet Filter 在 wicket 之外使用它(例如)。

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

如何控制 Wicket 表单中的 JPA 持久性? 的相关文章

  • 如何使用 Windows 上运行的 Java 服务检测用户活动?

    我的目标是使用 Java 创建一个系统监控应用程序 我想知道用户何时在 Windows PC 上进行活动 结果会是这样的 8 00 8 15 活动 9 12 10 29 活动 12 24 15 34 活动 我对任何其他信息 按下了哪个键 使
  • Hibernate统计打印HQL:null

    我是使用休眠的新手 我打开了统计信息 与普通的 HQL 查询一起 我得到了许多这样的统计信息 INFO Statistics HQL null time 1724ms rows blah 有人可以以任何方式帮助我为什么null查询大约需要
  • 使用 org.eclipse.xsd 和 Maven2 分析 XML 模式

    我正在尝试实现示例代码本文 http help eclipse org help32 index jsp topic org eclipse xsd doc references articles dwtip1 scpw index htm
  • HQL - 分页的行标识符

    有谁知道HQL是否有一个关键字来标识行 例如ROWID或ROWNUM 我想使用 HQL 实现分页 但我无法使用 setMaxResult 或 setFirstResult 因为我不直接使用会话对象 因此不使用 Query 对象 而只是将查询
  • 在java中将HTML转换为RTF?

    我需要将 HTML 转换为 RTF 我正在使用以下代码 private static String convertToRTF String htmlStr OutputStream os new ByteArrayOutputStream
  • 如何将堆栈跟踪转换为字符串?

    转换结果的最简单方法是什么Throwable getStackTrace 到描述堆栈跟踪的字符串 Use Throwable printStackTrace PrintWriter pw https docs oracle com java
  • Linux 上的 JavaFX

    Linux x86 和 x64 上的 JavaFX 情况如何 JavaFX 应用程序可以在 Linux 操作系统上顺利执行吗 我发现了 2011 年和 2012 年的一些问题 当时应用程序不稳定 目前发布的 JFX 版本是 2 2 4 在
  • java中简单程序中的“未为类型定义方法”错误

    所以我只是想学习 Java 在观看了一些教程并阅读了一些基本内容之后 我对为什么它无法运行感到困惑 package Test public class TestProg public static void main String args
  • 获取 Spring Boot 中当前活动数据源的引用

    我想通过实现数据库数据初始化DataSourceInitializer 我将这些方法放在我的 Spring Boot 主方法下面 但似乎它根本没有被执行 我尝试故意删除字符只是为了触发一个错误来确认执行 什么也没有发生 Configurat
  • 面临 process.start(); 的问题在 Android 棒棒糖中

    面临一个问题process start 在 Android 棒棒糖中 我在服务中遇到了 android lollipop 后台进程的问题 我的代码在 KitKat 之前工作正常 我有一个ProcessBuilder pBuilder并向其中
  • Java Reflection:为什么这么慢?

    我一直避免使用 Java 反射 因为它速度缓慢 我在当前项目的设计中达到了一个点 能够使用它将使我的代码更具可读性和优雅性 所以我决定尝试一下 我只是对这种差异感到惊讶 我注意到有时运行时间几乎延长了 100 倍 即使在这个简单的例子中 它
  • StringBuilder - 重置或创建新的

    我有一个条件 StringBuilder 不断存储与大型平面文件 数百 MB 中的模式匹配的行 但是 在达到条件后 我将 StringBuilder 变量的内容写入文本文件 现在我想知道是否应该通过重置对象来使用相同的变量 gt strin
  • Selenium - WebDriver.findElement() 和 WebElement.findElement() 之间的区别

    我正在使用WebElement findElement By cssSelector click 在页面上查找某个元素 但它返回了 Unable to locate element 但是当我使用WebDriver findElement B
  • 在 libgdx 中截取屏幕截图

    我有一个应用程序 我想在其中截取游戏屏幕的屏幕截图并将其保存为图像并上传到 Facebook 我正在使用 Libgdx 我的重点是 android 谁能帮助我如何以编程方式截取游戏屏幕并将其另存为图像 现在相当容易 Libgdx提供了一个例
  • SwingWorker 和 Executor 的区别

    我正在使用 SwingWorker 在我正在制作的应用程序上执行一些重负载任务 虽然今天我遇到了 Executor 类和这个例子 Executors newCachedThreadPool execute new Runnable publ
  • 在java中访问dll方法

    我正在尝试访问java中用c 编写的dll方法 从下面的代码我试图构建已成功生成的 dll using System using Microsoft Win32 namespace CyberoamWinHelper public clas
  • Java中有没有办法随机获取HashMap的值?

    Java中有没有办法随机获取HashMap的值 这有效 Random generator new Random Object values myHashMap values toArray Object randomValue values
  • JPA2+Hibernate 3.6.0 中的 JTA 还是 LOCAL 事务?

    我们正在重新思考我们的技术堆栈 以下是我们的选择 由于应用程序的复杂性等 我们不能没有 Spring 和 Hibernate 我们还从 J2EE 1 4 迁移到 Java EE 5 技术栈 Java EE 5 JPA 2 0 我知道Java
  • Java:当计时器处于活动状态时,JSplitPane 将顶部面板的内容复制到底部面板

    所以我有一个 JSplitPane 和两个 JPanel 一个在顶部 一个在底部 在这两个面板中 我重写了paintComponent方法并添加了我自己的图形 在底部面板中 我想添加动画 当面板不重新绘制时 这很好 但是一旦计时器 java
  • DocumentBuilder 解析产生无效字节 2 of 4 字节 UTF-8 序列错误

    我正在尝试解析包含字符串的字节数组Impresi n in XML final DocumentBuilderFactory builderFactory DocumentBuilderFactory newInstance final D

随机推荐