`
endual
  • 浏览: 3506432 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring mvc jpa 引入包中的实体类

 
阅读更多

http://www.iteye.com/topic/1131643

最近在做一个web项目. 大系统下有三个子Web模块. 
打包时会生成webA.war, webB.war, webC.war. 
因为三个子模块有共用的model, 所以我将共有的model层提取到一个公共的模块中:model 
系统用maven构建.关系为 

parent 
|------pom.xml 
|------model 
          |------pom.xml 
|------webA 
          |------pom.xml 
          |------...META-INF/persistence.xml 
|------webB 
          |------pom.xml 
          |------...META-INF/persistence.xml 
|------webC 
          |------pom.xml 
          |------...META-INF/persistence.xml 

在抽取共用model模块之前,web中的JPA(Hibernate实现)使用了注解进行entity的声明. 
所以persistence.xml的配置很简单:

Xml代码  收藏代码
  1. <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">  
  2.         <provider>org.hibernate.ejb.HibernatePersistence</provider>          
  3.         <properties>  
  4.             <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>  
  5.             <property name="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}"/>  
  6.             <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>  
  7.             <property name="hibernate.connection.charSet" value="UTF-8"/>  
  8.          </properties>  
  9.     </persistence-unit>  
  10. </persistence>  

 但在引入公用的包,再运行服务器,会报出"Caused by: org.hibernate.MappingException: Unknown entity:  ***"的错误.

 经过Google发现,原因是使用Hibernate 如果存在实体在web引用的jar包中,必须在persistence.xml声明这些实体:

Xml代码  收藏代码
  1. <persistence ...>  
  2.     <persistence-unit ...>   
  3.         <class>x.y.z.model.A</class>               
  4.         <class>x.y.z.model.B</class>  
  5.         <class>x.y.z.model.C</class>  
  6.         ....  
  7.     </persistence-unit>  
  8. </persistence>  

  

 但我们的体统中的实体数量并不在少数.有接近100个之多.随着新业务的开发,实体数量还会继续添加.一个一个的声明太过于麻烦.但遗憾的是hibernate在这里并不支持正则表达式.

幸好jpa(hibernate)支持,引入jar. 并在jar中自动查找所有实体,只需要这样声明:

Xml代码  收藏代码
  1. <persistence ...>  
  2.         <jar-file>classpath:../lib/model.jar</jar-file>  
  3. </persistence>  

 

经过这样修改,服务又能正常启动了.

 

但这样的修改引入了另一个问题. 之前的Junit 集成测试不能使用了.

Junit使用了spring对junit4的注解.

Java代码  收藏代码
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext.xml")  
  3. public class XXXIntegrationTest {  
  4.   
  5.     @Test  
  6.     public void testA() {......}  
  7.   
  8. }  

 不论是在maven下,还是在eclipse中,都会提示java.net.MalformedURLException: unknown protocol: classpath ,而刚才的对persistence.xml的修改正好此入了classpath:..相关的代码.而spring-test的相关类对这样的设置并没有正确的处理. 只有将<jar-file>classpath:../lib/model.jar</jar-file>中的classpath改为开头的file:的路径,spring-test才能正确识别. 
所以在测试时,只能将 persistence.xml再改为: <jar-file>file:D:\.m2\repository\...\model.jar<jar-file>才能正确执行.

在打包和测试时,来回修改persistence.xml文件是一件很麻烦的事.只能通过maven的profile来解决了.所以在web模块的pom中加入以下声明.

Xml代码  收藏代码
  1. <project ...>  
  2.     <properties>  
  3. ....  
  4.         <jpa.jar.file>file:${settings.localRepository}/package.../${project.version}/model-${project.version}.jar</jpa.jar.file>  
  5.     </properties>  
  6.   
  7. <build>  
  8.     <plugins>  
  9.           <plugin>  
  10.                 <artifactId>maven-antrun-plugin</artifactId>  
  11.                 <version>1.7</version>  
  12.                 <executions>  
  13.                     <execution>  
  14.                         <phase>process-resources</phase>  
  15.                         <configuration>  
  16.                             <tasks>  
  17.                                 <replace token="@ENTITY-JAR-FILE@" value="${jpa.jar.file}" dir="target/classes/META-INF">  
  18.                                     <include name="**/persistence.xml" />  
  19.                                 </replace>  
  20.                             </tasks>  
  21.                         </configuration>  
  22.                         <goals>  
  23.                             <goal>run</goal>  
  24.                         </goals>  
  25.                     </execution>  
  26.                 </executions>  
  27.               </plugin>  
  28.         </plugins>  
  29.   </build>  
  30.   
  31.   
  32.   <profile>  
  33.     <id>prod</id>  
  34.     <properties>  
  35.         <jpa.jar.file>classpath:../lib/model-${project.version}.jar</jpa.jar.file>  
  36.     </properties>  
  37.   
  38.   </profile>  
  39. </project>  

 并在persistence.xml中的jar-file以下修改:

 

Xml代码  收藏代码
  1. <jar-file>@ENTITY-JAR-FILE@</jar-file>  

 
这样打包和开发就都能顺利进行了.

但回头想想. 解决这个问题还是费了不少时间.

如果一开始直接在persistence.xml定义一串很长的实体列表.虽然看起来比较笨,也不会引入新的问题.其实也挺省时间.

声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
分享到:
评论

相关推荐

    Spring + Spring MVC + SpringData JPA + mysql +jsp实现一个简易的个人博客系统

    • 实体层,ORM映射 • User类、 Status类、Comment类 • 存储层,数据库CRUD • UserRepository类、StatusRepository类、CommentRepository类 • 服务层,封装复杂业务逻辑 • UserService类、StatusService类...

    Springboot天猫商城.zip

    接下来,我们可以创建一些实体类来表示商城中的商品、订单等对象,并使用 JPA注解来映射到数据库表。例如,一个商品类可能包含属性名、价格、描述等信息。 然后,我们可以创建一系列控制器类来处理来自客户端的请求...

    Spring Boot中文文档.rar

    spring boot中文文档,从安装到部署。 I. Spring Boot文件 1.... 2.... 3.... 4.使用Spring Boot ...实体类 30.3.2.Spring数据JPA存储库 30.3.3.创建和删除JPA数据库 30.3.4.在View中打开EntityM

    SpringDataREST.zip

    Spring Data REST 的目标是提供坚实的基础,从而使用 HTTP REST 语义来开放 CRUD 操作到你的 JPA 库管理的实体。这个端口的首次实现使用 Spring MVC 以及标准的 Servlet 架构,从而简单的包括你的域类和他们的对应...

    Spring in Action(第二版 中文高清版).part2

    16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 下载Spring A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把...

    Spring in Action(第二版 中文高清版).part1

    16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 下载Spring A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    该案例采用目前最流行、最规范的java ee架构,整个应用分为jpa实体层、eao层、业务逻辑层、mvc层和视图层,各层之间分层清晰,层与层之间以松耦合的方法组织在一起。该案例既提供了ide无关的、基于ant管理的项目源码...

    Spring面试题

    在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类...

    springboot参考指南

    实体类 ii. 28.3.2. Spring Data JPA仓库 iii. 28.3.3. 创建和删除JPA数据库 viii. 29. 使用NoSQL技术 i. 29.1. Redis i. 29.1.1. 连接Redis ii. 29.2. MongoDB i. 29.2.1. 连接MongoDB数据库 ii. 29.2.2. MongoDB...

    JAVA程序开发大全---上半部分

    13.2.2 使用反向工程生成JPA实体类和DAO类 234 13.2.3 调整生成的实体类标注 237 13.2.4 使用JPA功能 238 13.3 MyEclipse中支持JPA规范的工具 238 13.3.1 JPA透视图 239 13.3.2 JPA标注配置视图 239 13.3.3 JPA代码...

    基于SpringMVC+Hibernate4的考勤管理系统+.zip

    基于SpringMVC+Hibernate4的考勤管理系统+.zip 项目环境 系统:Windows7 X64位系统 IDE:Intellij IDEA 14.0 后端技术选型 J D K 版 本:JDK 1.8 数 据 库:Mysql 5.7 ...spring-webmvc-4.0.0.RELEASE

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    spring-framework-tutorial:有关String框架的教程列表

    有关依赖注入,面向方面的编程和Spring MVC的教程列表 前提条件 :red_exclamation_mark: 您应该至少对Java SE有良好的了解 相关资源 :information: 概述 :green_book: 1.1简化Java开发。 (Spring的优势) 1.2装...

    Springboot 2020年开发脚手架管理系统(10.75G)

    第02讲_springboot及MVC架构基本原理介绍.mp4 第03讲_新建一个springbootboot项目并运行起来.mp4 第04讲_使用springbootboot实现helloworld并进行自定义配置.mp4 第05讲_从控制器传值到freemark模板并展示在页面.mp4...

    J2EE应用开发详解

    294 16.3.5 数据库连接池中使用JDBC 297 16.4 小结 302 第17章 ORM与Java持久化机制 303 17.1 ORM概述 303 17.2 域模型 304 17.3 实体域对象的持久化模式 304 17.4 JPA 305 17.4.1 实体 306 17.4.2 EntityManager ...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.3. Seam 中的可点击列表:消息示例............................................................................................................................. 27 1.3.1. 理解代码.........................

Global site tag (gtag.js) - Google Analytics