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

Я думаю, что исключение, которое вы опубликовали, вызвано тем, что нет единицы постоянства, которая соответствует имени, которое вы передали в Persistence.createEntityManagerFactory. В вашем случае:

<persistence-unit name="TimeEven DataBasePU">

Итак, можете ли вы проверить свой persistence.xml, если вы уверены, что имя единицы персистентности совпадает с тем, что вы написали в коде?

Или, опубликовать свой [ 113] может быть полезно для решения вашей проблемы.

РЕДАКТИРОВАТЬ 1: Можете ли вы проверить свои зависимости?

Если вы используете maven (pom.xml), он должен иметь:

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>javax.persistence</artifactId>
  <version>2.1.1</version>
  <scope>provided</scope>
</dependency>
11
задан James McMahon 17 April 2009 в 15:37
поделиться

2 ответа

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

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

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

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

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

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

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

10
ответ дан 3 December 2019 в 05:36
поделиться

Есть кое-что, что вы должны сделать, чтобы иметь возможность сделать это, но это совсем немного. Предположительно, вы будете использовать 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);
    }
 }

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

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

11
ответ дан 3 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: