用于富客户端Java(Swing)应用程序的持久性Web服务

时间:2010-12-20 10:26:03

标签: java web-services http jpa persistence

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

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

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

是否有这样的持久性服务???

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

该服务应该与 JPA注释的POJO 一起使用,因此它应该在服务器上使用某种JPA持久性提供程序。目前,我正在使用Hibernate,所以如果它主动支持Hibernate,那么它是一个优点。当然POJO类必须包含在服务器端JPA配置中,我不希望处理任何一种未知的POJO。

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

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

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

当客户端应用程序访问时,持久性服务的客户端应该能够自动/透明地执行延迟加载请求 POJO中的延迟加载属性(在稍后的时间点,而不是在初始查询中)。因此,在将POJO转移到客户端后,透明延迟加载应该仍然有效

新的,更新的/脏的或待删除的POJO可以由持久性服务的客户端发送到服务器,其中保持持久并且成功/失败状态被发回(例如,给予新持久的POJO的ID)。可以在一个请求中发送几个待保存的POJO。

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

但是,您无法最小化通过线路发送的数据。

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

答案 1 :(得分:0)

事务,服务器请求处理,验证和访问控制都是像你所说的那样超越持久层领域的东西。您将找不到实现这些功能的持久性服务。

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

Grails是一个流行的Java Web框架,提供scaffolding。我相信还有很多其他人。我建议看一下Grails。

答案 2 :(得分:0)

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