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

Как далеко работает инфраструктура spring с обработкой транзакций? Мое прочтение книги "Spring В действии" предложения с примерами о том, что вы создаете методы DAO, которые не беспокоят управление сеансом и транзакциями довольно просто, настроив сеанс factory и шаблон транзакции в XML, а затем подключив их в ваш DAO. С другой стороны, документация SpringSource.org предполагает, что для этого требуется тонна XML и/или аннотации.

Какая правда здесь, самый простой способ, которым я могу взять код в строках

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

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

preform database actions

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

Ответ 1

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

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

2) Декларативный через XML - многословный XML, но неинвазивный

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

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

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

Сначала я всегда обращаюсь к документам ref и обращаюсь только к книге, если она не в документах.

Ответ 2

Существует некоторая работа, которую вы должны сделать, чтобы иметь возможность сделать это, но это не так много. Предположительно, вы будете использовать JPA, чтобы выбрать своего собственного поставщика, например. Hibernate. Затем вам нужно поместить 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 верхние ссылки также заслуживают внимания.