【问题标题】:JPA client-server replication/synchronization framework?JPA 客户端-服务器复制/同步框架?
【发布时间】:2011-10-25 09:02:32
【问题描述】:

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

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

我的问题始于实体的 ID:在客户端和服务器端使用相同的 ID 听起来确实很糟糕,因此我应该为客户端 ID 和实体的服务器端 ID 存储一些映射。 问题仍然存在,因为我有很多实体(15~20..),以及它们之间的关联。

将正确的 ID-s 放置在服务器通信(更新、合并)或客户端会促进具有一些递归和反射代码,一个引擎,它会持续跟踪映射的 ID-s:

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

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

提前致谢, 安德拉斯升

【问题讨论】:

    标签: java jakarta-ee jpa persistence derby


    【解决方案1】:

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

    【讨论】:

    • 我使用相同 ID 的基本问题是离线可用性。当我在客户端有一个新实体时,但是例如没有服务器连接,我仍然需要先在客户端存储实体,所以ID来自客户端DB,然后在同步期间我必须再次处理ID-s..
    【解决方案2】:

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

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

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

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    

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

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

    见:Sequence Generator in persistence.xml

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

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

    见:JPA ID Generation Strategy

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

    见:JPA / Hibernate / Derby TableGenerator use negative values

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

    希望这会有所帮助。

    【讨论】:

    • 感谢您的提示!我想知道是否有任何框架,我可以跳过为我的许多嵌套实体实现这样的 ID 处理逻辑。
    • 休眠监听器为所有实体工作。它在任何实体保存到数据库时运行。唯一的其他 ID 逻辑是在从客户端到服务器的同步上。你也可以为此写一个监听器。然后所有内容都包含在 2 个类中。
    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多