2009-04-16 2 views
11

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

Что есть истина здесь, то, что это самый простой способ я могу взять код вдоль линий

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

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

preform database actions 

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

ответ

10

Пружина обеспечивает, по меньшей мере, 3 способа демаркации транзакций:

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

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

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

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

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

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

11

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

+0

Спасибо за ответ, я буду играть с этим завтра на работе. Тем не менее, обе ваши ссылки в конце совпадают. –

+0

извините, но ссылка, которую я поставил, содержит еще 3 ссылки, включая другой, который я имел в виду ... – topchef

+0

Теперь ссылка не работает ... –

Смежные вопросы