最近我使用Spring3.0、JPA2.0和最新的Wicket来更新WicketCool。下面是我最近研究的简要概述, 展示使用Maven快速进入Spring3.0和JPA2.0的快速教程。
1. 依赖项
a) Spring
要使用Spring框架3.0,你不能像之前那样为其添加引用项了
<dependency> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> <version>2.5.6</version> </dependency>
这已经不能用了。因为Spring框架已经被划分成了20个模块:
如果你创建的web应用,那你可能需要使用的模块如下:
- 所有Core容器的:Beans, Core, Context和Expression Language
- AOP
- 数据访问/集成: Transactions, ORM
- Web中的:Web (即使你不使用SpringMVC,你可能也需要考虑使用web模块中的OpenEntityManagerInViewFilter。
- Test
因此下面是我们需要在pom.xml中设置的依赖项:
<properties> <spring.version>3.0.0.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> </dependencies>
b) JPA 2.0
既然我们已经将Spring3的依赖项弄好,那么我们就看看JPA2.0的依赖项。我们必须知道,JPA自身仅仅是标准,因此,在设置时,我们实际上需要选择供应商。 我可以使用Hibernate或EclipseLink。Hibernate目前还处于beta阶段,EclipseLink则是标准的参考实现。因此我认为EclipseLink是个更好的选择。然而经过研究后,我认为还是先使用Hibernate为好。
Hibernate的新特性是,你不需要再依赖core、annotation、commons-annotation等。现在只需要一个依赖。另一个依赖就是标准API。
<dependencies>
<dependency>
<groupId>org.hibernate.java-persistence</groupId>
<artifactId>jpa-api</artifactId>
<version>2.0-cr-1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.0-Beta-2</version>
</dependency>
</dependencies>
你可能也需要添加JBoss的Maven库:
<repositories>
<repository>
<id>JBoss Repo</id>
<url>http://repository.jboss.com/maven2</url>
</repository>
</repositories>
2. 配置
简单应用的上下文配置文件看上去如下:
<? xml version = "1.0" encoding = "UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- holding properties for database connectivity /--> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- enabling annotation driven configuration /--> <context:annotation-config /> <context:component-scan base-package="wcpackage" /> <tx:annotation-driven transaction-manager="transactionManager" /> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" /> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory" /> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter"> <property name="loadTimeWeaver"> <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> </property> <property name="persistenceUnitName" value="wctemplatePU"></property> </bean> <bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" p:database="${jpa.database}" p:showSql="${jpa.showSql}" /> </beans>
让我们假设wcpackage是组件扫描的根包,wctemplatePU是持久化单元的名字。
现在我们需要做的就是在META-INF/persistence.xml中定义持久化单元。
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="wctemplatePU" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.hbm2ddl.auto" value="validate" /> </properties> </persistence-unit> </persistence>
这是最基本的。你已经让Spring配置了,然后可以在你的服务类中使用EntityManager。
@Repository (value = "userDAO" ) public class UserDefaultDAO implements UserDAO { @PersistenceContext private EntityManager entityManager;
注入EntityManager将带有事务范围内的持久化上下文、资源本地的事务类型(意味着事务使用数据库事务而不是JTA)