代码之家  ›  专栏  ›  技术社区  ›  Zak

如何使用JPA使库对象数据库持久化?

  •  2
  • Zak  · 技术社区  · 14 年前

    我在一个小应用程序上使用了JPA。现在我需要创建一个基本上扩展或封装图形数据结构对象的数据结构。图形将需要持久化到数据库。

    对于我自己编写的可持久对象,扩展它们非常容易,并且扩展类也很容易持久。但是,我现在发现自己想要在jgrahpt库中使用一个与图形相关的对象库(节点、边、简单图形、定向图形等)。但是,基类并没有定义为可持久的JPA对象,所以我不确定如何将这些类保存到数据库中。

    我有几个想法,我想要一些反馈。

    选项1)

    使用decorator设计模式为基类的扩展版本添加持久性。

    挑战:

    --如何持久化类的私有字段,使其处于正确的状态?我是否只是扩展类,添加一个ID字段,并将其标记为可持久的?JPA如何从父类中获取必要的字段?(像Ruby的运行时类修改在这里非常棒)

    --有一个类层次结构(抽象图、有向图、有向加权图等)。如果我扩展以获得持久性,那么扩展类仍然没有公共的父类。如何解决此问题?(同样,像Ruby的运行时类修改在这里会非常棒)

    选项2)复制粘贴整个代码库。修改每个文件的源代码,使其与JPA兼容。

    --显然,这是一个很大的工作

    我相信还有其他的选择。你为我准备了什么????

    2 回复  |  直到 14 年前
        1
  •  3
  •   BenM    14 年前

    基类是否遵循JavaBeans命名约定?如果是这样,您应该能够使用JPA的XML语法映射它们。

    本规范第10章记录了这一点:

    XML描述符旨在 作为替代和 Java语言的重写机制 元数据注释。

    此XML文件通常称为orm.xml。这个 schema is available online

        2
  •  0
  •   Jherico    14 年前

    如果您使用的是预先存在的库,那么使用JPA注释的选项似乎非常有限。另一种选择是使用类似HibernateXML映射文件而不是JPA的文件。可以在类本身之外声明映射。私有字段不是问题,Hibernate将通过反射忽略访问修饰符。但是,根据代码的内部逻辑(例如,Hibernate使用特殊的集合和代理,如果类直接访问它们的一些属性而不是内部使用getter方法,则会使您陷入困境),即使这样做,最终也可能比它的价值更麻烦。

    另一方面,我不明白为什么你会认为选项2“很多工作”。创建一个ORM映射并不是一个简单的任务,不管你怎么做,我个人认为选项2可能是最简单的方法。您可能希望将其作为补丁文件进行维护,这样就可以跟上库的更新,而不仅仅是分叉。