Автоматическое управление транзакциями Hibernate с помощью Spring?

StackOverflow https://stackoverflow.com/questions/758050

Вопрос

Насколько далеко фреймворк Spring заходит в обработке транзакций?Мое чтение книги «Spring In Action» с ее примерами предполагает, что вы создаете методы DAO, которые не беспокоятся об управлении сеансами и транзакциями, достаточно просто путем настройки фабрики сеансов и шаблона транзакции в XML, а затем подключения их к вашему DAO.С другой стороны, документация SpringSource.org предполагает, что для этого потребуются тонны XML и/или аннотаций.

В чем здесь правда, каков самый простой способ взять код по принципу

get session from sessionfactory
open transaction
preform database actions
commit transaction with error handling

и сделай это просто

preform database actions

сократить до минимума количество стандартного транзакционного кода, который у меня есть в моих методах?

Это было полезно?

Решение

Spring предоставляет как минимум 3 способа разграничения транзакций:

1) Программная обработка через TransactionTemplate или PlatformTransactionManager — легкая конфигурация, но инвазивная.

2) Декларативный через XML — подробный XML, но неинвазивный.

3) Декларативный с помощью аннотаций — легкий XML, а не инвазивный.

Какой из них вы выберете, зависит от того, какой из них лучше всего соответствует вашим потребностям. Spring не делает этот выбор за вас.Судя по вашему вопросу, похоже, что вам нужен подход к аннотациям.

Я предлагаю прочитать справочное руководство Spring, раздел обработки транзакций, управляемых аннотациями.Это ясно и кратко.

Я всегда сначала просматриваю справочную документацию и просматриваю книгу только в том случае, если ее нет в документации.

Другие советы

Чтобы добиться этого, вам придется проделать определенную работу, но ее совсем немного.Предположительно, вы будете использовать JPA, выбрав своего собственного провайдера, например.Спящий режим.Затем вам нужно поместить файл persistence.xml, определяющий единицу персистентности, в папку META-INF:

<?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_1_0.xsd" 
             version="1.0">
    <persistence-unit name="YourDatabasePersistenceUnitName" transaction-type="RESOURCE_LOCAL"/>           
</persistence>

Затем определите все необходимое для подключения к базе данных в контексте приложения Spring, которое вы используете, как минимум оно должно содержать следующее:

<bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>/WEB-INF/jdbc.properties</value>     
        </property>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
          destroy-method="close" scope="singleton">
        <property name="driverClassName" value="org.postgresql.Driver"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="YourDatabasePersistenceUnitName"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="database" value="POSTGRESQL" />
                <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/>
                <property name="showSql" value="true"/>
                <property name="generateDdl" value="false"/>
            </bean>
        </property>     
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
        <property name="dataSource" ref="dataSource"/>
    </bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

 <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

Некоторые свойства выше могут быть изменены или добавлены в зависимости от ваших потребностей.Как вы уже догадались, пример предназначен для JPA с базой данных Hibernate и PostgreSQL.

Теперь вы можете просто определить методы доступа к данным следующим образом:

@Repository
@Transactional
public class UserJpaDAO {

    protected EntityManager entityManager;

    @PersistenceContext
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public void save(User theUser) {
        entityManager.persist(theUser);
    }

    public User update(User theUser) {
        return entityManager.merge(theUser);
    }
 }

где Пользователь — это объект JPA, определенный вашим приложением.Вы можете управлять транзакциями на уровне менеджера/контроллера, который вызывает ваши DAO - на самом деле я делаю это именно так - но я поместил это здесь вместе, чтобы не слишком загромождать пример.

Хорошие ссылки, к которым вы, возможно, захотите перейти прямо вместо моих примеров:http://icoloma.blogspot.com/2006/11/jpa-and-spring-fucking-cooltm_26.htmlТакже стоит посетить первые 3 ссылки, на которые он ссылается.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top