`
endual
  • 浏览: 3556919 次
  • 性别: 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文章版权属于作者,受法律保护。没有作者书面许可不得转载。
分享到:
评论

相关推荐

    Mavne 整合Spring MVC JPA 框架

    JPA通过映射Java实体类到数据库表,简化了数据库操作,避免了SQL的直接编写。它还提供了事务管理、查询语言JPQL(Java Persistence Query Language)和 Criteria API等功能,提高了代码的可读性和可维护性。 **整合...

    基于jpa+hibernate+spring+spring mvc注解方式项目

    这个项目案例对于初学者来说,是一个很好的实践平台,可以帮助理解Spring、Spring MVC、JPA和Hibernate之间的协作,以及如何在实际项目中应用这些技术。通过实际操作,可以加深对这些框架的理解,提升开发技能。

    Spring+Spring MVC+SpringData JPA整合完成增删改查,翻页实例.zip

    接下来,定义实体类,这些类对应数据库中的表,通常使用@Entity注解标识。同时,还需要定义Repository接口,这个接口扩展了Spring Data JPA提供的基本接口,比如JpaRepository或CrudRepository,通过方法签名来定义...

    spring mvc spring spring jpa集成

    Spring MVC、Spring 和 Spring JPA 是Java开发中的三大核心框架,它们共同构建了一个高效、灵活的Web应用程序开发环境。在本教程中,我们将探讨如何将这些框架与MySQL数据库进行集成,以便实现数据的持久化存储。 ...

    spring mvc jpa单元测试例子

    我们可以在`application-test.properties`中配置H2,并在测试类中使用`@Sql`注解来执行SQL脚本,初始化测试数据。 本例子中的项目使用MyEclipse创建,这是一款集成开发环境,支持Maven构建。这意味着项目结构遵循...

    spring mvc jpa cxf dwr jar包合集

    Spring MVC、JPA、CXF和DWR是Java开发中常用的四大框架或库,它们各自在不同的领域提供了强大的功能,并且在企业级应用开发中扮演着重要的角色。下面将详细介绍这些技术及其相互间的关联。 **Spring MVC** Spring ...

    spring mvc + jpa 集成实例(有带包)

    在Java企业级开发中,Spring MVC和JPA(Java Persistence API)是两个非常重要的框架。Spring MVC作为Spring框架的一部分,用于构建Web应用程序的模型-视图-控制器架构,而JPA则是Java平台上的ORM(对象关系映射)...

    spring mvc 与JPA/Hibernate的整合示例

    在Java Web开发中,Spring MVC和JPA(Java Persistence API)以及Hibernate作为ORM(对象关系映射)框架的实现,是构建高效、可维护性的应用的常见选择。本示例将探讨如何将这三个组件整合在一起,以实现一个完整的...

    Spring MVC 集成JPA

    - **实体类定义**:`MyUser`类中的每个属性都对应于数据库表中的一个字段,通过使用`@Column`注解指明了字段名。`@Id`注解标识主键,而`@GeneratedValue`则用于指定主键的生成策略。值得注意的是,`birthYear`字段...

    spring mvc整合jpa后项目

    - 在Spring配置文件中,我们需要引入JPA的相关依赖,如数据源、实体管理工厂(EntityManagerFactory)、事务管理器等。 - 使用`LocalContainerEntityManagerFactoryBean`来创建EntityManagerFactory,配置数据源、...

    springdatajpa 包括jar包

    Spring Data JPA与Struts2的整合,可以让我们在Struts2的Action类中方便地调用Spring Data JPA提供的数据服务,实现业务逻辑。这通常需要在Struts2的配置文件中配置Action类,并在Spring的上下文中配置Repository...

    spring MVC JPA

    4. **配置实体扫描**:声明哪些包下的类被用作JPA实体。 5. **配置事务管理**:Spring提供声明式事务管理,只需在Service层的方法上添加@Transactional注解即可。 6. **创建Entity类**:每个Entity类对应数据库中的...

    spring data jpa + spring + json demo

    【描述】中的"简单的springMVC入门程序配置Spring data jpa亲测可完美运行"说明这是一个基于Spring MVC的项目,Spring MVC是Spring框架的一部分,用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构模式的...

    整合spring data jpa + spring mvc + easyui

    1. **配置Spring Data JPA**:首先需要在Spring配置文件中启用JPA支持,配置数据源、实体扫描路径、JPA供应商(如Hibernate)等。然后定义Repository接口,Spring Data JPA会自动创建实现类。 2. **配置Spring MVC*...

    spring mvc jpa

    首先,为了在Spring MVC项目中引入JPA,我们需要添加相应的依赖。在Maven项目的pom.xml文件中,我们需要包括Spring Data JPA、Hibernate(一个流行的JPA实现)和相关的数据库驱动。例如,如果使用MySQL,需要添加...

    spring mvc data jpa maven demo 全注解

    标题中的“Spring MVC Data JPA Maven Demo 全注解”是指一个使用Spring MVC、Spring Data JPA和Maven构建的示例项目,该项目全面利用注解进行配置,旨在简化开发流程并提高效率。让我们详细了解一下这三个核心组件...

    手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换 webDemo

    在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...

    spring boot jsp mvc jpa hibernate mysql 示例 sample

    6. **整合流程**:在 Spring Boot 项目中,首先需要在 `pom.xml` 或 `build.gradle` 文件中引入相应的依赖,如 `spring-boot-starter-web`、`spring-boot-starter-data-jpa` 和 MySQL 驱动。然后配置数据库连接参数...

    spring mvc 的jpa JpaRepository数据层 访问方式汇总

    在本篇文章中,我们将深入探讨如何在Spring MVC应用中使用JpaRepository来操作数据库。 首先,我们需要理解Spring MVC的架构。它是Model-View-Controller模式的实现,用于处理HTTP请求并将其转发到相应的业务逻辑。...

    spring4.2,spring mvc,spring data,jpa,hibernate的程序构架

    JPA允许我们定义实体类,这些类代表数据库表,然后通过注解来配置映射关系。通过 EntityManager 和 EntityManagerFactory,我们可以执行CRUD(创建、读取、更新、删除)操作,而无需编写大量的SQL代码。此外,Spring...

Global site tag (gtag.js) - Google Analytics