最近在做一个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定义一串很长的实体列表.虽然看起来比较笨,也不会引入新的问题.其实也挺省时间.
相关推荐
在Maven的pom.xml文件中,添加Spring、JPA和Hibernate的依赖项。这可能包括Spring的核心模块、数据JPA模块以及Hibernate的实现: ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-...
该压缩包文件“jdk 1.8 springmvc+hibernate+springData jpa基本框架.rar”是一个基于Java技术栈的Web开发项目模板,主要涵盖了Spring MVC、Hibernate和Spring Data JPA这三个核心组件。这个项目是针对Java 1.8版本...
在IT行业中,Spring Boot、Hibernate和JPA是Java开发领域中的关键组件,它们极大地简化了企业级应用的构建。本文将深入探讨如何在Spring Boot项目中利用JPA(Java Persistence API)来连接Hibernate,实现数据库操作...
在项目中引入这些jar包后,开发者可以按照JPA的规范定义实体类,使用注解来描述对象与数据库表的映射关系。然后,通过EntityManager进行CRUD(创建、读取、更新、删除)操作,或者使用Criteria API或HQL来执行复杂的...
在Java开发中,Java Persistence API (JPA) 和 Hibernate 是两个非常重要的框架,它们用于对象关系映射(ORM)和数据库交互。JPA是Java EE规范的一部分,提供了一种标准的方式来管理和持久化Java对象,而Hibernate是...
1. **配置Spring容器**:在Spring配置文件中,我们需要声明JPA的实体管理和事务管理。这通常通过`<jee:jndi-lookup>`或`<bean>`标签实现,为EntityManagerFactory和PlatformTransactionManager定义bean。 2. **添加...
接下来,为了使用Hibernate作为JPA提供商,我们需要在项目的pom.xml文件中添加Hibernate和Spring Data JPA的依赖。Spring Data JPA是Spring的一个模块,它提供了对JPA的高级抽象,使得我们可以很容易地实现CRUD操作...
通过这个实例,开发者可以学习到如何在SpringBoot应用中集成Hibernate和JPA,实现数据持久化。同时,也理解Maven如何管理项目依赖,使得整个开发流程更加高效和规范。在实际项目中,这种架构可以作为一个基础模板,...
Spring3、SpringMVC、JPA(Java Persistence API)和Hibernate是Java开发中常见的四大框架,它们在企业级应用开发中扮演着至关重要的角色。这个项目集成了这些框架,为开发者提供了一个快速搭建Web应用程序的基础...
在本项目中,我们探索的是一个基于2017年技术栈的Java Web应用程序实例,主要涉及Spring Data JPA、Spring 4.2、Spring MVC和Hibernate 4.3。这些技术是Java开发中的核心组件,尤其在企业级应用开发中广泛使用。下面...
在Java 8中引入的Optional接口,旨在解决null引用的问题,提升代码的可读性和安全性。Hibernate 5.2.10.Final版本可能已经采用了Optional接口来封装返回值,减少空指针异常的可能性,提高代码质量。开发者在使用...
为了进一步提升效率,Hibernate提供了一级缓存和二级缓存机制,一级缓存是每个Session内的缓存,二级缓存则可以在多个Session之间共享,有效减少了数据库的访问次数。 总结来说,"Spring+SpringMVC+SpringDataJPA+...
在项目中引入 Spring Data JPA 和相应的 JPA 实现(如 Hibernate),配置实体扫描路径、数据源、JPA 配置、Repository 扫描等。 **4. 实体类与表的映射** 使用 `@Entity` 注解标记实体类,`@Table` 定义对应的...
此外,Hibernate4还引入了对JPA 2.0规范的完整支持,包括实体间的一对多、一对一、多对多关系,以及复杂的查询操作。 在压缩包中,"spring+jpa"很可能包含了一系列配置文件,如`applicationContext.xml`用于配置...
在IT行业中,Spring、Hibernate和JPA是三个非常重要的框架,它们在企业级应用开发中起着关键作用。本文将详细解析"spring4+hibernate4+jpa 附有jar包"这个主题,帮助你理解和掌握这些技术的集成与应用。 首先,...
1. 创建Maven项目,定义`pom.xml`文件,引入Spring、Spring MVC、Hibernate和JPA的相关依赖。 2. 配置Spring的`applicationContext.xml`,定义Bean并进行依赖注入。 3. 配置Spring MVC的`servlet-context.xml`,设定...
- 使用JPA配置实体类、数据源和事务管理。 #### 五、实践技巧 - **优化性能**:合理配置缓存策略,减少不必要的数据库访问。 - **安全性**:确保所有HTTP请求经过适当的安全验证,避免SQL注入等安全漏洞。 - **...
在Spring Boot中结合Druid和JPA,我们可以在Druid的数据源中配置JPA的entityManagerFactory,这样Druid就能监控到由JPA产生的数据库操作。同时,由于Druid提供了丰富的监控功能,我们可以方便地查看数据库连接的使用...
在Java世界中,Java Persistence API(JPA)是用于管理和持久化Java对象到关系数据库的标准规范。它使得开发者能够以面向对象的方式处理数据,而无需过多关注底层的SQL语句。JPA通过Hibernate等实现器提供了强大的...
在现代的Java Web开发中,为了进一步提高开发效率,SpringDataJPA和JdbcTemplate也常常被引入,它们都是Spring提供的数据访问抽象层。 **Spring框架**:Spring是一个全面的Java企业级应用开发框架,它提供了AOP...