首页 > 代码库 > Spring + hibernate + JPA 配置

Spring + hibernate + JPA 配置

最近对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="http://www.mamicode.com/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="http://www.mamicode.com/org.hibernatespatial.sqlserver.SQLServerSpatialDialect" />
            <property name="hibernate.show_sql" value="http://www.mamicode.com/true" />
            <property name="hibernate.hbm2ddl.auto" value="http://www.mamicode.com/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之类来的快。

Spring + hibernate + JPA 配置