将JPA实体打包在Spring Boot应用程序内的jar中

时间:2017-08-24 14:15:36

标签: jpa spring-boot

我正在重构一个JEE REST(使用JAX-RS 2.0)应用程序作为Spring Boot应用程序。我的旧应用程序打包在.war中,并且有一个包含实体的jar文件和用于JPA的persistence.xml配置文件。这个jar被复制到WEB-INF / lib目录中。我知道Spring JPA的工作方式不同,我现在不使用persistence.xml,但我想知道我是否可以将我的JPA实体类封装在一个jar中,并将它们包含在我的Spring Boot应用程序中,就像我现在所做的那样。这样我就可以在不同的Spring Boot应用程序中轻松地重用该jar。

3 个答案:

答案 0 :(得分:1)

我很确定你能做到这一点,因为我最近在我的一个项目上做了同样的事情。您唯一需要做的就是确保在主Spring Boot配置类中添加@EntityScan注释,并在JAR中添加实体的基础包。

@EntityScan("my.external.jar.entity.package")

答案 1 :(得分:0)

在我的情况下,我遇到了这个问题,将库导入应用程序的pom.xml后,在SpringBoot Project Main类中,在第一个包和*中插入一个@EntityScan注释。像这样:@EntityScan ("br.*")

答案 2 :(得分:0)

Spring Boot并不真正在乎JPA实体是作为单独的jar打包还是包含在应用程序中。它的运行时框架和运行时类可以从jar中加载(它应该驻留在BOOT-INF/lib中,也可以直接从Spring Boot工件中的* .class文件中直接加载。

现在在Spring Boot中有一条规则,那就是说它将仅在“主”类所在的包中或在其下的包中扫描Bean(包括实体)。这样做是为了避免长时间分析您可能使用的第三方类。这些第三方类通常根本不具备Spring意识,当然也不包含任何Spring bean。

示例:

说,您将“主”类(用@SpringBootApplication注释的类)放在了包中:com.mycompany.myapp

在这种情况下,将扫描以下软件包(仅几个示例):

  • com.mycompany.myapp
  • com.mycompany.myapp.web
  • com.mycompany.myapp.services.bl
  • com.mycompany.myapp.whatever.doesnt.matter ...

但是,不会扫描以下软件包(同样,示例,而不是完整列表):

  • com.mycompany
  • com.anothercompany
  • org.hibernate

如果您要“更改”此默认规则并将实体放置在不遵守此约定的程序包中,例如com.mycompany.jpa.entities,那么您确实应该使用@EntityScan注释作为我们的同事已经建议了。

您可以阅读有关此主题here的信息。如果您使用的是spring数据,但您可能还需要熟悉@EnableJpaRepositories,尽管与此相关,但主题却不同。