是否可以拥有远程管理的实体?

时间:2011-08-12 23:07:28

标签: java jpa devforce

我对JPA并不熟悉,但我有这样的场景:我想在KISS / DRY原因上在服务器和客户端(Java SE)上使用相同的类(读取“代码”)。在我看来,一种可能的方法是在客户端上有一个(特殊的?)EntityManager,它将实体请求传递给服务器,最后将所有实体传递回服务器以获取“批处理持久化操作“类可以(重新)验证它们的数据,应用一些事务操作(更新和填充),并且所有这些都可以通过JPA实现很好地保留。

问题是:这可能吗?怎么样? (有没有解决方案呢?用“一些”代码来解决这个问题很简单吗?)


编辑:好的,让我为每个人澄清一些事情。我的背景是使用内部增长的应用程序框架,该框架使用所谓的通用持久性服务;即用于执行CRUD操作的服务(单个事务中每个操作一个服务)但由类(在服务内)支持,这些类拦截这些操作并提供验证和(通常)复杂的业务规则(对其他表的更新,等等。)。这是使用较旧的Microsoft产品实现的。现在转向.NET,最近出现了类似工作但更高级的框架,如DevForce和CSLA。 DevForce特别提供了我在Java中也想做的事情(请参阅this page上的“在客户端执行”段落,然后访问this page以获得更好的概述。)

我对这个一般主题的一个较老的问题:Java "equivalent" to CSLA

2 个答案:

答案 0 :(得分:1)

我之前尝试过做类似的事情,也许只是对我的发现有点分享(我当时正在使用Hibernate + XFire for WS)

我相信你的想法在理论上有效。您需要做的只是序列化您的托管实体并将其发送到客户端。客户端反序列化并更新对象(当然,在客户端,它只是普通的POJO,而不是托管实体)并将其发送回服务器。此时,Server收到的对象只是一个分离的对象。您可以重新连接到会话(JPA / Hibernate将为您执行那些乐观的并发检查),并执行持久性。

然而,它只适用于非常简单的POJO。其中一个主要问题是,在JPA(或主要是所有ORM框架)中,您在不同实体之间建立了关系。例如,一个订单将与产品和帐户有关系,一个帐户将与客户有关联,客户将有地址列表......等。如果你因为懒惰的提取,关系而在服务器端进行操作,这是很好的。在您访问它之前,实际上并未获取它。但是,当您执行序列化时,它将成为一个难以解决的问题:像JAXB这样的大多数序列化解决方案只是递归地导航所有属性。结果是,您希望仅将Order对象发送到客户端,但最终您将向客户端发送大量数据。简单地告诉序列化程序不要序列化某些属性是行不通的,因为当对象被发回并将分离的obj重新附加到会话时,JPA / Hibernate无法知道如果你只是忽略了这种关系,或者你实际上是消除这种关系。当然,你仍然可以采取一些技巧,但所有这些都使这种方法难以采用,而且不再优雅。

答案 1 :(得分:0)

你的想法很聪明。

但不可能按照你的建议去做。为什么不呢?那么,要回答这个问题,我们必须先了解“什么是管理实体”。

托管实体只不过是“缓存”实例。驻留在实体管理器内的实例。如果您通过网络将此实例发送到另一台计算机,那么您正在对其进行序列化,因此复制它:在远程服务器上创建另一个实例,当然,该实例未受管理(因为实体管理器没有甚至都知道它的存在。)

另一方面,可能存在一些“足够智能”来模拟实体管理器并且可以“管理”这个复制的实体,但这不符合JPA规范,你必须自己实现它(它没有'似乎很容易)。我不认为那里有任何可靠的东西。

您的解决方案是明确地从您的客户端(通过从服务器公开的方法)持久,更新等。

相关问题