`
Classicning
  • 浏览: 251163 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring+JPA几点注意

    博客分类:
  • Tech
阅读更多
JPA即Java Persistence API,它通过annotation的形式指定实体类到关系数据库的映射,再通过以EntityManager为核心的API进行数据库的增删查改操作,此外还有一套类似于HQL的JPQL查询语言。总体来说,JPA最大的特点就是有效地简化了ORM的配置。JPA是一套标准,标准化的好处不言而喻,比如JDBC。目前JPA的实现包括Hibernate3.2,TopLink,OpenJPA等等。这些实现都遵循了JPA的统一规范,也就是说,如果不使用个别框架的高级特性的话,只要替换lib中的文件,简单地修改一下persistence.xml的属性设置,就可以更换掉底层的ORM框架;对于纯粹的JPA实现,代码上无需做任何改动。

Spring2.0之后的版本对JPA也有支持,但是我个人不太喜欢在JPA的代码中再引入Spring的JpaTemplate。第一,JPA本身就是为了摆脱具体实现的束缚,使用了JpaTemplate虽然隔离了ORM框架,却造成了SpringAPI的侵入;第二,JPA的接口已经非常简洁,这一点不同于JDBC,Spring的JdbcTemplate可以有效地简化代码,但是在JPA上这种效果并不明显。所幸,Spring并不强求只用JpaTemplate同样可以引入Spring的依赖注入和事务支持,这方面Spring的Reference上也特别指出了。

昨天整合Spring和JPA进行测试的时候遇到了几个的问题:
<ol>
<li>在测试时应使用Reference中提到的Application Managed EntityManagerFactory。因此在配置EntityManagerFactory时要使用org.springframework.orm.jpa.LocalEntityManagerFactory,其中的属性只需设置persistenceUnitName。persistence.xml要放在META-INF目录下。</li>
<li>测试时应通过ApplicationContext的方式初始化,而不是BeanFactory,否则将造成@PersistenceContext或@PersistenceUnit无法注入。即使手动声明EntityManager进行注入也无法使用事务支持。关于ApplicationContext和BeanFactory的区别,容我今天补一下。。。</li>
<li>要在每个使用事务支持的DAO上用@Transactional标注,然后在Spring的配置文件中加上
引用
<tx:annotation-driven transaction-manager="transactionManager" />

(transactionManager要在xml文件中声明,具体可以看Spring的Reference。)此外,还要注意的是配置文件的schema要使用spring-beans-2.5.xsd而非2.0。
</li>
<li>最后执行测试时可能会报以下错误:

引用
java.lang.NoSuchMethodError:javax.persistence.PersistenceContext.properties()


看了Spring的论坛才知道这是由于我们在开发Web项目时,通常将Tomcat的lib加入到classpath中,而在Tomcat的lib中有一个annotation-api.jar,其中包含了一个旧版本的javax.persistence包,与我们要用的ejb3-persistence.jar中的同名类发生了冲突。解决方法是在运行测试时,打开Eclipse的Run对话框,在classpath一项中将ejb3-persistence.jar加入到bootstrap中即可。
</li>
</ol>
分享到:
评论
1 楼 TrampEagle 2008-04-02  
不错。

相关推荐

Global site tag (gtag.js) - Google Analytics