Java 从POJO分离JPA信息

Java 从POJO分离JPA信息,java,maven,jpa,Java,Maven,Jpa,我正在从事一个项目,该项目将使用JPA将实体持久化到数据库。我们将使用Maven作为项目管理框架。我想知道是否有可能为POJO创建一个项目,为持久性定义创建另一个项目,然后将这两个项目“组合”成一个包含POJO及其持久性信息的输出 基本上,我试图将POJO从持久性定义中分离出来。因为POJO可能会被几个不同的项目重用,这些项目可能需要也可能不需要持久化POJO,也可能不想更改持久化信息。(类似但不完全相同) 关于如何做到这一点,我有两个想法。如果要在web应用程序中使用POJO,我可以提供per

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

基本上,我试图将POJO从持久性定义中分离出来。因为POJO可能会被几个不同的项目重用,这些项目可能需要也可能不需要持久化POJO,也可能不想更改持久化信息。(类似但不完全相同)

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


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

如果我没记错,那么如果不使用注释,注释就不必位于类路径上。带注释的类仍然可以加载

因此,我的建议是:

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

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

      至于与持久性相关的成员(例如id),我可能与模型类中的成员共存,但使用本文()中的建议,我扩展了POJO类,并在“entity”子类中声明了id。在定义POJO对成员的访问权限时,确实需要考虑这一点

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


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

      我相信您使用persistence.xml覆盖注释是正确的。这是我采取的一种方法。但是在添加注释和其他依赖项时,我知道在某些情况下它们可能不需要或不想要,这似乎是错误的。@user1723105这就是为什么我建议将JPA依赖项声明为可选的。为什么在非JPA应用程序中需要JPA类?将有一些字段,比如技术主键、乐观锁定的版本字段等,这些字段在JPA应用程序之外可能并没有任何意义,可能不应该被访问。这就是重点。在非JPA应用程序中,我并不真正需要JPA。这些类可以在不需要持久化数据或希望更改数据持久化方式的应用程序中重用。因此,我想我应该将JPA内容(映射、注释等)与对象模型的其余部分分开。是的,可能有一些不必要的成员,比如id,但我可能(也许我应该)通过使POJO的实体类扩展并将它们映射为映射的超类来解决这个问题。。。也许在我有更多需要之前,我不应该过度设计东西。