最近对hibernate的JPA实现比较感兴趣,在此记录下配置方法,备查。
先上maven依赖包配置,这里使用的是spring3.1.2和hibernate3.6.0
<dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>3.6.0.Final</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.1.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.1.2.RELEASE</version> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc</artifactId> <version>4.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.1</version> </dependency> <dependency> </dependencies>
然后是spring配置 applicationContext.xml,需要注意的是此处数据源是JNDI,在生产环境下建议使用此方式,而不建议使用properties文件,因为提供给实施人员的代码都是各种war包,别人不可能剥开你的war包来修改properties。而是直接改中间件的数据源配置。其他一些配置如路径之类的最好都交给容器来配置,而不要把经常改动的配置文件放在工程里。
<jee:jndi-lookup id="mssql" jndi-name="jdbc/test" /> <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="mssql"></property> <property name="persistenceUnitName" value="sample"></property> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="emf" /> </bean> <mvc:annotation-driven /> <tx:annotation-driven />
最后是JPA配置 类路径下META-INF/persistence.xml,多个数据库方言,请配置多个单元!
<?xml version="1.0" encoding="UTF-8"?> <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 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="sample" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="hibernate.dialect" value="org.hibernatespatial.sqlserver.SQLServerSpatialDialect" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit> </persistence>
在JAVA bean中注入JPA的EntityManager对象,以DAO为例,如此就能在spring中正确集成JPA了
@Transactional public abstract class BaseDao<T> implements IBaseDao<T> { @PersistenceContext protected EntityManager em; ... }
最后,谈下个人的理解,JPA相比与hibernate独有的sessionFactory来讲更有利于ORM开发。最近在看的GraniteDS就比较推荐使用JPA的方式做ORM。到底好不好,还有待后续的积累来验证。
做ORM的目的主要还是一个,就是代码的简洁灵活。目前公司使用的还是spring的jdbcTemplate,要自行管理SQL语句,做CRUD操作以及生成对象或集合要相对繁琐。而且当工程量大了以后,SQL语句的维护是一件麻烦的事情。不如hibernate之类来的快。
原文:http://ccjava.blog.51cto.com/8646011/1560383