JPA / Hibernate удалить все в сущности - PullRequest
2 голосов
/ 27 июля 2011

У меня есть этот класс сущностей

public class Entity {

    @Id 
    @Column(name="ID")
    private int id;

    @OneToMany(mappedBy="flusso", cascade=CascadeType.ALL, orphanRemoval=true)
    private List<Cron> listCron;

    //getter and setter Method
}

и в моем классе Дао у меня есть этот метод

(...)
    @Transactional
    public void removeAll(Entity entity) throws PersistenceDaoException {
        try {
            final Class<? extends Object> paramClass = entity.getClass();
            String nameClass = paramClass.getSimpleName();
            Query q = em.createQuery ("DELETE FROM " + nameClass);
            int del = q.executeUpdate ();
            if (del == 1){
                System.out.println("risultato:" + del);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
(...)

Я делаю простой тест, и у меня есть эта проблема:

javax.persistence.TransactionRequiredException: Executing an update/delete query
    at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:310)
    at $Proxy24.executeUpdate(Unknown Source)
    at it.synclab.fb.jpa.dao.impl.GenericDaoImpl.removeAll(GenericDaoImpl.java:138)
    at it.synclab.fb.jpa.dao.impl.FlussoDaoImpl.removeAll(FlussoDaoImpl.java:143)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    at $Proxy22.removeAll(Unknown Source)
    at it.synclab.fb.jpa.test.FlussoDaoTest.main(FlussoDaoTest.java:30)

Этот метод помечен @Transactional, где я делаю неправильно?

PS: Это моё приложениеContext.xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="fb-persistence" />
    </bean>

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

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


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


    <bean name="entityDaoImpl" class="it.synclab.fb.jpa.dao.impl.EntityDaoImpl" />

1 Ответ

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

Убедитесь, что в вашем контексте есть менеджер транзакций.

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

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean> 

http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html (9.5.6)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...