Сделка с Spring e Jpa - PullRequest
       27

Сделка с Spring e Jpa

0 голосов
/ 12 июля 2011

У меня та же проблема , мои транзакции не записываются в БД.Я думаю, что это проблема проблем Spring не является ошибкой фреймворка, а проблемой файла конфигурации (applicationContext.xml для понимания), поэтому я поместил свой файл конфигурации:

...    
            <!-- this is a bridge for entityManager and PersistenceUnit -->
        <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
            <property name="persistenceUnitName" value="fb-persistence" />
        </bean>


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

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    <bean name="pluginDaoImpl" class="it.synclab.fb.jpa.dao.impl.PluginDaoImpl" />
</beans>

интерфейс:

public interface PluginDao {

    public Plugin load (int id);

    public void save(Plugin plg);
}

реализация интерфейса:

public class PluginDaoImpl implements PluginDao {

    @PersistenceContext (unitName="fb-persistence")
    private EntityManager em;

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

    @Transactional
    public Plugin load(int id) {
        return em.find(Plugin.class, id);

    }
    @Transactional(readOnly=false, propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void save(Plugin plg) {
        em.persist(plg);
        //em.flush();

    }
}

и Дульсис в Фундо, мой PluginTest (для грязного тестирования):

public class PluginTest{

    public static void main(String[] args) {        
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        PluginDao dao = (PluginDao) applicationContext.getBean("pluginDaoImpl");

        Plugin plugin1 = new Plugin();
        //inserisco un nuovo plugin
        //plugin.setId(14);
        plugin1.setMethod("prova");
        plugin1.setDescrizione("questa Bean Class!");
        dao.save(plugin1);

        Plugin plugin = new Plugin();
        //carico un plugin per id
        plugin =  dao.load(9);

        System.out.println("id: " + plugin.getId() + 
                         " Descrizione: " + plugin.getDescrizione() + 
                         " Method: " + plugin.getMethod());
    }

Если я сейчас добавлюmethod PluginDaoImpl.save (), em.flush line-code Я получаю эту ошибку:

Exception in thread "main" javax.persistence.TransactionRequiredException: no transaction is in progress *

* причина не указана.

1 Ответ

1 голос
/ 12 июля 2011

Вам не хватает <tx:annotation-driven transaction-manager="myTransactionManager"/>
в вашем context.xml

(см. Использование @Transactional)

Добавьте пространство имен tx следующим образом:

<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...