JPA客户机-服务器复制/同步框架



我有一个简单的客户端(JavaSE, Swing) - 服务器(Java EE, EJB, JPA)架构。

我想为我的服务器端实体创建一个客户端"缓存"。例如,如果我下载了一个实体,我将把它存储在嵌入式Derby数据库中(使用客户端JPA),因此下次需要时,客户机可以首先在自己的数据库中查找并从中检索实体,从而节省网络通信。(简单的复制)

我的问题始于实体的ID:在客户端和服务器端拥有相同的ID听起来真的很糟糕,所以我应该为一个实体的客户端ID和服务器端ID存储一些映射。问题还在继续,因为我有这么多实体(15~20…),以及它们之间的关联。

将正确的ID-s放在服务器通信(更新,合并)或客户端可以促进一些递归的,可能是反射的代码,一个引擎,它保持跟踪映射的ID-s:

  • 如果我修改了客户端实体,并希望合并到服务器,在发送到服务器之前,它应该替换实体集中的客户端id(在各种@OneToMany外键中)
  • 从服务器端,问题是反之亦然

有谁知道这样一个框架,特别是JPA用户吗?或者你有一些实现技巧吗?//如果可能的话,我想在应用程序持久化级别解决这个问题

提前感谢,安德拉斯升

什么不使用相同的id ?似乎你不会有任何问题,如果你没有尝试不同的…

我最近编写了一个客户端,它必须与服务器同步实体,并将它们存储在本地Derby DB中。客户端还可以创建必须与服务器同步的新实体。此外,客户机和服务器都使用相同的实体类、DAO和服务层组件。我将分享我遇到的问题和我的解决方案。如果它们是相关的,我希望它们能有所帮助。

我在客户端和服务器上使用相同的ID字段。

您可能遇到的一个问题是自动生成密钥。我的服务器密钥是在MS SQL server数据库中自动生成的。我的实体是这样注释的。

@Id
@GeneratedValue(strategy = GenerationType.AUTO)

第一次将实体同步到本地Derby数据库时,我需要一种方法来使用服务器拥有的相同ID。

为此,我在客户机应用程序上创建了一个允许直接输入键的orm.xml文件。xml将覆盖注释。

参见:Sequence Generator in persistence.xml

当然,在上面的链接中,我为本地数据库指定了一个自定义生成器。您可以将ID字段指定为没有自动生成。

我需要一个客户端生成器,因为我正在创建新的实体。在这种情况下,我需要一种方法来生成新的键和插入实体从服务器。我使用Hibernate作为JPA提供程序。这样我就可以创建一个侦听器来判断这个实体是新的还是已经有了id。基于此,我要么允许生成器创建id,要么使用实体已经拥有的id。

参见:JPA ID生成策略

接下来,我需要一种方法让服务器知道哪些实体是新的。从上面的链接中,您可以看到我的生成器在100000000处启动。在我的情况下,这个数字足够高,因为服务器在很长一段时间内(如果有的话)不会有那么高的ID。当然,这不是最干净的解决方案,我尝试在客户端上使用负数来表示所有id,但由于一个bug, Hibernate无法正确创建序列。

参见:JPA/Hibernate/Derby TableGenerator使用负值

所以在服务器上我检查所有出现的实体,如果它们中的任何一个超过魔术数字(100000000),我在保存之前将其ID清空。这样,服务器将把它们作为新的添加,并且它们将从服务器获得一个ID。然后它们必须同步回客户端等等。

希望这有帮助。

最新更新