【问题标题】:Peristence Web Service for Rich Client Java (Swing) applications用于富客户端 Java (Swing) 应用程序的持久性 Web 服务
【发布时间】:2010-12-20 10:26:03
【问题描述】:

我正在将我的客户端-服务器富客户端数据库应用程序 (Swing) 重写为具有 Netbeans RCP 富客户端的三层应用程序。

默认情况下 Hibernate 和其他 JPA 提供程序只能从富客户端以非常麻烦 的方式使用(本机数据库连接未通过防火墙,丢失延迟加载,管理 Session/EntityManager 生命周期的概念问题......等等其他问题)。因此,需要某种扩展才能在富客户端中舒适地使用它们。

通常,富客户端在业务逻辑层(在服务器上)调用 webservices。通常,专用 Web 服务方法处理每个对象类型的CRUD 操作。 现在,我不想为我的应用程序的每个持久类的 CRUD 操作编写自定义 Web 服务,所以我认为可能会有一个 通用持久性网络服务,用于此类操作,至少可以处理应用程序的所有 CRUD 操作

有这样的持久化服务吗???

以下是我的想法/要求的详细信息

该服务应该与 JPA-annotated POJOs 一起使用,因此它应该在服务器上使用某种 JPA 持久性提供程序。目前,我正在使用 Hibernate,所以如果它积极支持 Hibernate,那就是一个加号。当然 POJO 类必须包含在服务器端 JPA 配置中,我不希望处理任何类型的未知 POJO。

我不想创建单独的值对象或数据传输对象来在服务的客户端和服务器部分之间发送数据。我想仅使用 JPA 注释的 POJO,即使是 transfer。我相信这是当今的标准做法。

客户端应接收数据并将数据通过 HTTP 请求发送到服务的服务器端,以减少防火墙通信问题。 HTTP 代理的使用应该是可配置的。

持久化服务的客户端可以获取其执行的 JPA QL 查询的 POJO 列表结果(作为简单的查询字符串发送,可选**命名参数**也在请求中发送)。这些查询以 webservice 调用或简单 HTTP 请求的形式从客户端发送到 servlet。 如果可以在一个请求中发送多个 JPA 查询,那就太好了.客户端以 POJO 列表的形式接收请求的结果,这些 POJO 可能具有延迟加载集合和对象引用(这些不是在查询时从服务器发送的)。

当客户端应用程序访问一个POJO 中的延迟加载属性(在稍后的时间点,而不是在初始查询时)。因此,在将 POJO 转移到 客户端 之后,透明延迟加载应该继续工作

新的、更新的/脏的或要删除的 POJO 可以由持久性服务的客户端发送到更改持久化并成功的服务器/failure 状态被发回(例如,提供给新持久化 POJO 的 ID)。一个请求可以发送多个待保存的 POJO。

它应该有一种标记事务边界的机制,因此可以在一个数据库事务中执行多个独立的 HTTP 服务调用(保留类似 Session/EntityManager.beginTransaction()、commit() 和 rollback())。

如果验证访问控制检查可以插入服务器组件,那就太好了。

有没有这样的持久化服务项目??? 可能作为 JPA 持久性提供程序附带的扩展?

【问题讨论】:

    标签: java web-services http jpa persistence


    【解决方案1】:

    当我在 2002 年设计一个类似的应用程序时,我们四处寻找可以使用的框架,但最终不得不运行我们自己的框架。 将持久对象的子图传输到 swing 客户端是通过将这些子图转换为 DTO(DataTransferObjects)对象来完成的,该对象维护属性映射和信息,如果属性被客户端弄脏。在返回服务器的路上,只有脏的属性在 trx 中被更新了。

    您可能希望将 JDO 2.0 用作持久层。它支持从持久对象图中分离对象或子树,通过线路发送这些分离的对象并在以后的事务中重新附加这些对象。

    但是,您无法将通过网络发送的数据最小化。

    目前最好的选择:运行您自己的机制并将 createDTO 和 updateFromDTO 方法添加到您的持久对象,但我很高兴被证明是错误的。

    【讨论】:

    • 感谢您的回答。是的,脏检查和发送增量绝对应该是解决方案的一部分。
    • 你认为 JPA 在这项任务上的能力不如 JDO 吗?也支持分离。
    • 我想我推荐 JDO 是出于稳健性的原因:它的存在时间比 JPA 长得多。如果符合要求,请使用您喜欢的。
    【解决方案2】:

    正如您所说,事务、服务器请求处理、验证和访问控制都是远远超出持久层领域的事情。你不会找到实现这些东西的持久化服务。

    话虽如此,有许多 Web 框架可以快速为您提供 CRUD 操作的基本实现。特别是您要查找的术语是scaffolding

    Grails 是一个流行的 Java 网络框架,它提供了scaffolding。我敢肯定还有很多其他人。我建议看看 Grails。

    【讨论】:

    • 感谢您的回答。我希望第三方工具包处理的大多数问题仅由持久性服务使用(例如:事务边界可以简单地用 JPA 实体管理器的 beginTransaction()、commit() 标记。只有服务器端需要保留 EntityManager在这种情况下的会话。
    【解决方案3】:

    我将使用 Spring 和 JPA。 Spring 为您提到的大多数持久性管理问题提供了合理的默认值。(事务管理,延迟加载)

    【讨论】:

    • 感谢您的回答。你认为 Spring 支持 JPA 操作的 HTTP 远程处理吗?因为普通 JPA 需要 JDBC 驱动程序才能从客户端连接,这对防火墙不友好。
    • 您可以将 JPA 操作公开为 REST/HTTP 服务。事实上在春天,你可以通过多种方式做到这一点。 (粗麻布或新的基于 REST 的服务,都写在 Spring MVC 之上)。您可以使用 Spring ROO 编写一个将 JPA 实体公开为 REST Web 服务的应用程序,甚至无需编写一行代码。 static.springsource.org/spring-roo/reference/html/…
    • 我唯一的问题是您对“自动/透明地延迟加载请求”的要求。如果您将逻辑公开为服务,这是不可能的。由于客户端和服务之间发生了某种编组解组。发送给客户端的对象将完全形成(或急切加载)。 (否则你的 java 消息阅读器会抛出异常。)
    猜你喜欢
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多