我一直在使用JPA来处理我一直在做的小应用程序。我现在需要创建一个基本上扩展或封装图形数据结构对象的数据结构。该图需要持久保存到数据库中。
对于我自己编写的可持久对象,扩展它们非常容易,并且扩展类也很容易持久化。但是,我现在发现自己想在JGrahpT库中使用图形相关对象库(节点,边,简单图,有向图等)。但是,基类没有被定义为可持久化的JPA对象,所以我不确定如何将这些类保存到数据库中。
我有几个想法,我想要一些反馈。
选项1)
我一直使用装饰器设计模式将持久性添加到基类的扩展版本。
挑战:
- 如何保持类所需的私有字段处于正确状态?我是否只是扩展类添加ID字段,并将其标记为可持久化? JPA如何从父类中获取必要的字段? (类似于ruby的运行时类修改在这里会很棒)
- 有一个类层次结构(抽象图,有向图,有向加权图等)。如果我扩展以获得持久性,扩展类仍然不会有公共父类。我该如何解决这个问题? (同样,像ruby的运行时类修改这样的东西会非常棒)
选项2)复制粘贴整个代码库。修改每个文件的源代码,使其与JPA兼容。
- 显然这是很多工作
我敢肯定还有其他的选择..你有什么东西我????
答案 0 :(得分:3)
基类是否遵循JavaBeans命名约定?如果是这样,您应该能够使用JPA的XML语法映射它们。
这在说明书的第10章中有记载:
XML描述符旨在 作为替代和替代 Java语言的重写机制 元数据注释。
此XML文件通常称为orm.xml。 schema is available online
答案 1 :(得分:0)
如果您正在使用预先存在的库,那么使用JPA注释的选项似乎非常有限。另一种方法是使用Hibernate XML映射文件而不是JPA。您可以在类本身之外声明映射。私有字段不是问题,Hibernate将通过反射忽略访问修饰符。然而,根据代码的内部逻辑,即使这可能最终会比它的价值更麻烦(例如,Hibernate使用特殊的集合和代理,如果类直接访问它们的某些属性而不是使用它们,会让你陷入热水内部的getter方法)。
另一方面,我不明白你为什么认为选项2'做了很多工作'。无论你怎么做,创建ORM映射并不是一件简单的事情,而且我个人认为选项2可能是最省力的方法。您可能希望将其作为补丁文件进行维护,以便跟上库的更新,而不仅仅是分叉。