`
ybak
  • 浏览: 35431 次
  • 性别: Icon_minigender_1
  • 来自: XX
社区版块
存档分类
最新评论

jpa(Hibernate)实体在引入到多模块后遇到的问题和解决方法.

 
阅读更多

最近在做一个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的配置很简单:

<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>        
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}"/>
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
            <property name="hibernate.connection.charSet" value="UTF-8"/>
         </properties>
    </persistence-unit>
</persistence>

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

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

<persistence ...>
	<persistence-unit ...> 
		<class>x.y.z.model.A</class>             
		<class>x.y.z.model.B</class>
		<class>x.y.z.model.C</class>
		....
	</persistence-unit>
</persistence>

  

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

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

<persistence ...>
        <jar-file>classpath:../lib/model.jar</jar-file>
</persistence>

 

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

 

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

Junit使用了spring对junit4的注解.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext.xml")
public class XXXIntegrationTest {

	@Test
	public void testA() {......}

}

 不论是在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中加入以下声明.

<project ...>
    <properties>
....
        <jpa.jar.file>file:${settings.localRepository}/package.../${project.version}/model-${project.version}.jar</jpa.jar.file>
    </properties>

<build>
	<plugins>
          <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <phase>process-resources</phase>
                        <configuration>
                            <tasks>
                                <replace token="@ENTITY-JAR-FILE@" value="${jpa.jar.file}" dir="target/classes/META-INF">
                                    <include name="**/persistence.xml" />
                                </replace>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
              </plugin>
        </plugins>
  </build>


  <profile>
    <id>prod</id>
    <properties>
        <jpa.jar.file>classpath:../lib/model-${project.version}.jar</jpa.jar.file>
    </properties>

  </profile>
</project>

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

 

<jar-file>@ENTITY-JAR-FILE@</jar-file>

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

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

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

分享到:
评论
1 楼 endual 2014-01-08  
你好,请问你是否可以做个简单的demo给我看看,我对model.jar还是不理解。
非常感谢。我目前用的是
<persistence ...> 
    <persistence-unit ...>  
        <class>x.y.z.model.A</class>              
        <class>x.y.z.model.B</class> 
        <class>x.y.z.model.C</class> 
        .... 
    </persistence-unit> 
</persistence> 

这种解决方法。

相关推荐

    Spring + JPA + Hibernate配置

    在Maven的pom.xml文件中,添加Spring、JPA和Hibernate的依赖项。这可能包括Spring的核心模块、数据JPA模块以及Hibernate的实现: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-starter-...

    jdk 1.8 springmvc+hibernate+springData jpa基本框架.rar

    该压缩包文件“jdk 1.8 springmvc+hibernate+springData jpa基本框架.rar”是一个基于Java技术栈的Web开发项目模板,主要涵盖了Spring MVC、Hibernate和Spring Data JPA这三个核心组件。这个项目是针对Java 1.8版本...

    springboot利用jpa连接hibernate

    在IT行业中,Spring Boot、Hibernate和JPA是Java开发领域中的关键组件,它们极大地简化了企业级应用的构建。本文将深入探讨如何在Spring Boot项目中利用JPA(Java Persistence API)来连接Hibernate,实现数据库操作...

    JPA_Hibernate 4.3 jar包

    在项目中引入这些jar包后,开发者可以按照JPA的规范定义实体类,使用注解来描述对象与数据库表的映射关系。然后,通过EntityManager进行CRUD(创建、读取、更新、删除)操作,或者使用Criteria API或HQL来执行复杂的...

    JPA + Hibernate 3 CRUD操作历史审计日志的解决方案

    在Java开发中,Java Persistence API (JPA) 和 Hibernate 是两个非常重要的框架,它们用于对象关系映射(ORM)和数据库交互。JPA是Java EE规范的一部分,提供了一种标准的方式来管理和持久化Java对象,而Hibernate是...

    spring3.0.5与JPA2.0(hibernate3.6)的集成详细说明

    1. **配置Spring容器**:在Spring配置文件中,我们需要声明JPA的实体管理和事务管理。这通常通过`&lt;jee:jndi-lookup&gt;`或`&lt;bean&gt;`标签实现,为EntityManagerFactory和PlatformTransactionManager定义bean。 2. **添加...

    spring 整合 hibernate jpa2 实例

    接下来,为了使用Hibernate作为JPA提供商,我们需要在项目的pom.xml文件中添加Hibernate和Spring Data JPA的依赖。Spring Data JPA是Spring的一个模块,它提供了对JPA的高级抽象,使得我们可以很容易地实现CRUD操作...

    springboot+hibernate+maven+jpa

    通过这个实例,开发者可以学习到如何在SpringBoot应用中集成Hibernate和JPA,实现数据持久化。同时,也理解Maven如何管理项目依赖,使得整个开发流程更加高效和规范。在实际项目中,这种架构可以作为一个基础模板,...

    spring3+springmvc+jpa+hibernate

    Spring3、SpringMVC、JPA(Java Persistence API)和Hibernate是Java开发中常见的四大框架,它们在企业级应用开发中扮演着至关重要的角色。这个项目集成了这些框架,为开发者提供了一个快速搭建Web应用程序的基础...

    2017 spring data jpa+spring4.2+springmvc+hibernate4.3 maven环境intellij idea增删改查实例

    在本项目中,我们探索的是一个基于2017年技术栈的Java Web应用程序实例,主要涉及Spring Data JPA、Spring 4.2、Spring MVC和Hibernate 4.3。这些技术是Java开发中的核心组件,尤其在企业级应用开发中广泛使用。下面...

    hibernate-release-5.2.10.Final

    在Java 8中引入的Optional接口,旨在解决null引用的问题,提升代码的可读性和安全性。Hibernate 5.2.10.Final版本可能已经采用了Optional接口来封装返回值,减少空指针异常的可能性,提高代码质量。开发者在使用...

    Spring+SpringMVC+SpringDataJPA+Hibernate

    为了进一步提升效率,Hibernate提供了一级缓存和二级缓存机制,一级缓存是每个Session内的缓存,二级缓存则可以在多个Session之间共享,有效减少了数据库的访问次数。 总结来说,"Spring+SpringMVC+SpringDataJPA+...

    Spring Data JPA.zip

    在项目中引入 Spring Data JPA 和相应的 JPA 实现(如 Hibernate),配置实体扫描路径、数据源、JPA 配置、Repository 扫描等。 **4. 实体类与表的映射** 使用 `@Entity` 注解标记实体类,`@Table` 定义对应的...

    Spring3+JPA(Hibernate4实现)资源包及配置文件

    此外,Hibernate4还引入了对JPA 2.0规范的完整支持,包括实体间的一对多、一对一、多对多关系,以及复杂的查询操作。 在压缩包中,"spring+jpa"很可能包含了一系列配置文件,如`applicationContext.xml`用于配置...

    spring4+hibernate4+jpa 附有jar包

    在IT行业中,Spring、Hibernate和JPA是三个非常重要的框架,它们在企业级应用开发中起着关键作用。本文将详细解析"spring4+hibernate4+jpa 附有jar包"这个主题,帮助你理解和掌握这些技术的集成与应用。 首先,...

    maven 整合springMVC+hibernate+spring+jpa

    1. 创建Maven项目,定义`pom.xml`文件,引入Spring、Spring MVC、Hibernate和JPA的相关依赖。 2. 配置Spring的`applicationContext.xml`,定义Bean并进行依赖注入。 3. 配置Spring MVC的`servlet-context.xml`,设定...

    JSF+Spring+JPA(Hibernate实现)的环境搭建

    - 使用JPA配置实体类、数据源和事务管理。 #### 五、实践技巧 - **优化性能**:合理配置缓存策略,减少不必要的数据库访问。 - **安全性**:确保所有HTTP请求经过适当的安全验证,避免SQL注入等安全漏洞。 - **...

    Springboot中使用Druid+JPA

    在Spring Boot中结合Druid和JPA,我们可以在Druid的数据源中配置JPA的entityManagerFactory,这样Druid就能监控到由JPA产生的数据库操作。同时,由于Druid提供了丰富的监控功能,我们可以方便地查看数据库连接的使用...

    JPA搭建环境所需的jar包

    在Java世界中,Java Persistence API(JPA)是用于管理和持久化Java对象到关系数据库的标准规范。它使得开发者能够以面向对象的方式处理数据,而无需过多关注底层的SQL语句。JPA通过Hibernate等实现器提供了强大的...

    Maven整合Spring+SpringMVC+Hibernate+SpringDataJPA+JdbcTemplate

    在现代的Java Web开发中,为了进一步提高开发效率,SpringDataJPA和JdbcTemplate也常常被引入,它们都是Spring提供的数据访问抽象层。 **Spring框架**:Spring是一个全面的Java企业级应用开发框架,它提供了AOP...

Global site tag (gtag.js) - Google Analytics