Java JPA客户端服务器复制/同步框架?

Java JPA客户端服务器复制/同步框架?,java,jakarta-ee,jpa,persistence,derby,Java,Jakarta Ee,Jpa,Persistence,Derby,我有一个简单的客户端(JavaSE,Swing)服务器(javaee,EJB,JPA)架构 我想为我的服务器端实体创建一个客户端“缓存”。例如,如果我下载一个实体,我会将它存储在一个嵌入式Derby DB中(带有客户端JPA),因此下次需要时,客户端可以首先在自己的DB中查找并从那里检索实体,以避免网络通信。(简单复制) 我的问题从实体的ID开始:在客户端和服务器端使用相同的ID听起来是一种非常糟糕的做法,因此我应该为实体的客户端ID和服务器端ID存储一些映射。 这个问题还在继续,因为我有这么多

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

我想为我的服务器端实体创建一个客户端“缓存”。例如,如果我下载一个实体,我会将它存储在一个嵌入式Derby DB中(带有客户端JPA),因此下次需要时,客户端可以首先在自己的DB中查找并从那里检索实体,以避免网络通信。(简单复制)

我的问题从实体的ID开始:在客户端和服务器端使用相同的ID听起来是一种非常糟糕的做法,因此我应该为实体的客户端ID和服务器端ID存储一些映射。 这个问题还在继续,因为我有这么多的实体(15~20…),以及它们之间的关联

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

  • 如果我修改了一个客户端实体,并希望在发送到服务器之前合并到服务器,它应该替换实体集中的客户端ID(在各种@OneToMany外键中)
  • 从服务器端看,问题是vica反之亦然
有人知道这样一个框架吗,特别是对于JPA用户?或者您是否有一些实现技巧? //如果可能的话,我想在应用程序持久性级别解决这个问题

提前感谢,,
安德烈斯公升

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

什么不使用相同的ID?如果不尝试使用不同的实体,似乎不会有任何问题…

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

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

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

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
第一次将实体同步到本地Derby数据库时,我需要一种使用服务器具有的相同ID的方法

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

见:

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

我需要客户端上的生成器,因为我正在创建新实体。在这种情况下,我需要一种从服务器生成新密钥和插入实体的方法。我使用Hibernate作为我的JPA提供者。这允许我创建一个侦听器,以确定实体是新的还是已经有id。基于此,我要么允许生成器创建id,要么使用实体已经有的id

见:

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

见:

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


希望这有帮助

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

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

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

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
第一次将实体同步到本地Derby数据库时,我需要一种使用服务器具有的相同ID的方法

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

见:

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

我需要客户端上的生成器,因为我正在创建新实体。在这种情况下,我需要一种从服务器生成新密钥和插入实体的方法。我使用Hibernate作为我的JPA提供者。这允许我创建一个侦听器,以确定实体是新的还是已经有id。基于此,我要么允许生成器创建id,要么使用实体已经有的id

见:

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

见: