Spring+hibernate+JPA構成


最近hibernateのJPA実装に興味があり,ここでは構成方法を記録し,検討する.
まずmaven依存パッケージの構成を行い、ここではspring 3を使用します.1.2とhibernate 3.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構成アプリケーションContext.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独自のセッションファクトリーよりもORM開発に有利である.最近見ているGraniteDSではJPAを使ったORMがおすすめです.果たして良いかどうかは、後続の蓄積で検証される必要がある.
ORMの目的は主に一つで、コードの簡潔さと柔軟性です.現在、会社ではspringのjdbcTemplateを使用していますが、SQL文を自分で管理したり、CRUD操作をしたり、オブジェクトや集合を生成したりするのは比較的煩雑です.また、工事量が大きくなると、SQL文のメンテナンスが面倒になります.hibernateとかより早く来たほうがいいです.