【发布时间】:2011-08-12 23:07:27
【问题描述】:
我对 JPA 不太熟悉,但我有这种情况:出于 KISS/DRY 的原因,我想在服务器和客户端 (Java SE) 上使用相同的类(阅读“代码”)。在我看来,一种可能的方法是在客户端上有一个(特殊的?)EntityManager,它将对实体的请求传递给服务器,最后将所有实体传递回服务器以实现“批量持久化” action”,其中类可以(重新)验证它们的数据,应用一些事务性操作(更新和填充)并通过 JPA 实现很好地持久化。
问题是:这可能吗?如何? (是否已经有解决方案?用“一些”代码解决这个问题是否简单?)
编辑:好的,让我为大家澄清几件事。我的背景是使用内部开发的应用程序框架,该框架使用所谓的通用持久性服务;即用于在单个事务中执行 CRUD 操作(任何表的每个操作一个服务)的服务,但由拦截这些操作并提供验证的类(服务内)支持,并且(通常)复杂的业务规则(对其他表的更新, ETC。)。这是使用较旧的 Microsoft 产品实现的。现在转向 .NET,最近出现了类似工作但更高级的框架,如 DevForce 和 CSLA。 DevForce 尤其提供了我也想在 Java 中做的事情(请参阅 this page 上的“在客户端执行”段落,然后访问 this page 以获得更好的概述)。
我关于这个一般主题的一个较早的问题:Java "equivalent" to CSLA
【问题讨论】:
-
这与将分离的实体发送到客户端,修改它们,然后将它们发送回服务器进行重新连接和持久化有何不同?
-
@edalorzo 这就是我要说的,但是......“管理”是关键词。由于我的类是启用 JPA 的,所以在客户端上拥有一个 EntityManager 并添加(?)能力来“打包”我一直在使用的所有实体并将它们发送到,这不是“很好”吗?某个服务器上的 EntityManager 可以一次性妥善处理持久性事务?
-
我认为我还没有理解您的情况。从我的角度来看,客户甚至不应该知道存在实体管理器之类的东西。通过业务接口正确公开,服务器可以在客户端要求时执行您建议的所有工作,并且实体甚至不会放弃服务器的安全性。在并发方面,每个客户端都有一个持久性上下文一定是一场噩梦。根据并发级别,每个客户端都可能在很短的时间内变成过时的缓存。你不觉得吗?