如何使用常见的JPA实体布局Java EE项目?

我使用maven 3在WAR文件中打包了两个eclipse Java EE 6项目。现在,他们应该在第三个项目中共享JPA实体,因为它们都使用相同的数据库。

在对我的问题进行研究时,我发现了一些提示,例如在persistence.xml中引用了一个常见的jar,但是我没有成功使它工作。 特别问:

1)包含公共实体的项目是否具有persistence.xml文件? 如果是这样,它与其他项目的不同之处是什么?

2)两个项目中引用的常用实体到底有多准确? 我是否在persistence.xml中使用该标记作为参考? 如果是这样,如果MyCommin.jar位于WEB-INF / lib中,“lib / MyCommon.jar”是否是正确的使用方式?

3)如果应用程序在JBoss 6中部署为WAR或爆炸存档,它会有什么不同吗?

4)当通过添加到服务器运行时和发布时在eclipse中部署时,与部署外部eclipse有什么不同吗?

5)所描述的方式是将公共实体放在一个单独的项目中,创建一个JAR并在另一个项目中使用该JAR是一种合理的方式来处理共享公共实体类的问题还是有更好的方法?

1)包含公共实体的项目是否具有persistence.xml文件? 如果是这样,它与其他项目的不同之处是什么?

是。 主要区别在于模型项目中的persistence.xml应该定义所有实体,并且web项目中的persistence.xml应该只引用模型项目JAR文件。 否则,您在persistence.xml文件中保留重复的entites。

另一个可能的区别是模型项目中的那个应该使用资源本地事务类型,以便从项目内部进行unit testing(例如使用main()方法)非常容易。 Web项目中的那些当然应该使用例如JTA的数据源。


2)两个项目中引用的常用实体到底有多准确? 我是否在persistence.xml中使用标记作为参考? 如果是这样,如果MyCommin.jar位于WEB-INF / lib中,“lib / MyCommon.jar”是否是正确的使用方式?

是和否。 是正确的方法,但是文件名中有拼写错误,文件夹应该省略。 lib文件夹通常仅在您拥有EAR并且JAR包含在EAR的lib文件夹中时使用。

 MyCommon.jar 

3)如果应用程序在JBoss 6中部署为WAR或爆炸存档,它会有什么不同吗?

没有。设计得恰当的Java API不依赖于本地磁盘文件系统,而只依赖于类路径。 如果WAR被扩展,它使类路径没有区别。


4)当通过添加到服务器运行时和发布时在eclipse中部署时,与部署外部eclipse有什么不同吗?

从技术上讲,是的。 function上,没有。


5)所描述的方式是将公共实体放在一个单独的项目中,创建一个JAR并在另一个项目中使用该JAR是一种合理的方式来处理共享公共实体类的问题还是有更好的方法?

这绝对有道理。 你不想重复自己 。

根据我的经验,每个jar必须有一个持久性xml,这意味着每个EntityManager将绑定到一个持久性xml。 这意味着,为了让涉及来自不同jar的实体的事务,您需要使用JTA提供程序。 避免我上面提到的一个选项是,有一些Ant或Maven任务将来自不同jar的类组装到一个包含最终持久性xml的新jar中。

话虽如此,在我使用共享项目放置我的实体的项目中,我不得不最终放置所有实体(由于上述原因)。

我现在认为,最好的方法是将系统分解为垂直模块,其中每个模块管理它自己的实体,并且可以仅通过id引用其他模块中的实体。 这是我发现构建SOA应用程序和普通应用程序的最佳方式。 这样做的原因是它也减少了实体和模块之间的耦合。

有几个问题要问自己

  • 您真的想要2个不同的应用程序来更新相同的数据库表吗?
  • 如果您需要更新一个应用程序而另一个应用程序保持不变,您打算做什么?
  • 实体是否公开了应用程序真正需要的更多信息?