【问题标题】:Separating JPA information from POJO从 POJO 中分离 JPA 信息
【发布时间】:2015-10-12 14:08:23
【问题描述】:

我正在开发一个项目,该项目将使用 JPA 将实体持久化到数据库中。我们将使用 Maven 作为项目管理框架。我想知道是否可以为 POJO 创建一个项目,为持久性定义创建另一个项目,然后将两者“组合”成一个包含 POJO 及其持久性信息的输出。

基本上,我试图将 POJO 的代码与持久性定义分开。因为 POJO 可能被几个不同的项目重用,这些项目可能需要也可能不需要持久化它们,并且可能希望也可能不希望更改持久性信息。 (与Is it possible to build a JPA entity by extending a POJO?类似但不完全相同)

关于如何做到这一点,我有两个想法。如果我要在 Web 应用程序中使用 POJO,我可以提供 persistence.xml 并映射该项目中的类,然后将依赖项添加到包含 POJO 的项目中。但是如果我想创建一个包含持久性信息和 POJO 的 jar 文件,我想我可以使用 shade 插件吗?

有没有其他方法可以将两个 maven 项目合并到一个输出中,这是一个合理的做法吗?

【问题讨论】:

  • 为什么在非 JPA 应用程序中需要 JPA 类?会有一些字段,例如技术主键、乐观锁定的版本字段等,这些字段在 JPA 应用程序之外可能没有任何意义,并且可能不应该被访问。
  • 这就是重点。在非 JPA 应用程序中,我真的不需要 JPA。这些类可以在不需要持久化数据或想改变它的持久化方式的应用程序中重用。所以,我想我想将 JPA 内容(映射、注释等)与我的对象模型的其余部分分开。是的,可能有一些不必要的成员,例如 id,但我可能(也许我应该)通过使 POJO 的实体类扩展并将它们映射为映射超类来解决这个问题。 ...也许在我有更多需要之前,我不应该过度设计东西。

标签: java maven jpa


【解决方案1】:

如果我没记错的话,如果你不使用注解,它们就不必在类路径上。带注释的类仍然可以加载。

所以我的建议是:

  • 坚持使用 JPA 注释,因为这是定义映射的最简单方法,并且工具支持通常更好。
  • 将 JPA 依赖项声明为 optional,也可能声明为 provided
  • 如果您需要覆盖注释定义的映射,应该可以使用 persistence.xml、AFAIK(从未尝试过)来实现。

【讨论】:

  • 我相信你用persistence.xml覆盖注释是正确的。这是我采取的一种方法。但是知道在某些情况下可能不需要或不需要它们,这对我来说似乎是错误的。
  • @user1723105 这就是为什么我建议将 JPA 依赖项声明为可选的原因。
【解决方案2】:

我非常感谢您的意见。最后,我的解决方案是创建两个项目。第一个提供了 POJO 的定义,没有任何 JPA 信息。是的,有一些与 JPA 相关的成员,例如 id,但我会解决这些问题。第二个项目包含 JPA 元数据(orm 和持久性 XML 文件)。

至于与持久性相关的成员(例如 id),我可能会接受模型类中的成员,但使用这篇文章中的建议(Is it possible to build a JPA entity by extending a POJO?)我扩展了我的 POJO 类并在“实体”子中声明了 id类。在定义 POJO 以访问成员时,这确实需要考虑一些因素。

需要注意的一点是,当您拥有类层次结构(模型中的继承)时,此解决方案会遇到麻烦。 “纯”模型中的类继承自某个公共类。然后在“持久性”模型中扩展该类以提供 id 和其他与持久性相关的成员。现在,如果持久化子类从“纯”模型中的类继承,它们不会继承 id 和其他持久化成员。

在不同的继承映射中可能存在变通方法,例如每个具体类的表。

【讨论】:

    猜你喜欢
    • 2016-09-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多