Не может выполнить собственное обновление в JPA с JTA

Это мое приложение, развернутое на jboss 7.1.1 final, у меня ниже EJB для доступа к базе данных. Но я не могу понять, почему произошла ошибка.

@Stateless
public class JPAServiceBean implements JPAServiceLocal, JPAServiceRemote {
    @PersistenceContext(unitName = "vms4_jboss7")
    EntityManager em;

    public Object getByNative(String query, Map<String, Object> params) {
        Query nativeQuery = em.createNativeQuery(query);
        setParameters(nativeQuery, params);
        return nativeQuery.getResultList();
    }

    public <T extends Serializable> T get(String namedQuery,
            Map<String, Object> params) {
        Query query = em.createNamedQuery(namedQuery);
        setParameters(query, params);
        return (T)query.getSingleResult();
    }

    public <T extends Serializable> List<T> getList(String namedQuery,
            Map<String, Object> params) {
        Query query = em.createNamedQuery(namedQuery);
        setParameters(query, params);
        return query.getResultList();
    }

    public void persist(Object o) {
        em.persist(o);
    }

    public void remove(Object o) {
        em.remove(o);
    }

    public EntityManager getEm() {
        return em;
    }

    private void setParameters(Query query, Map<String, Object> params) {
        if (query == null || params == null) {
            return;
        }
        for (String key : params.keySet()) {
            query.setParameter(key, params.get(key));
        }
    }

    public int executeUpdate(String query, Map<String, Object> params) {
        Query q = em.createQuery(query);
        setParameters(q, params);
        return q.executeUpdate();
    }

    public int executeNativeUpdate(String query, Map<String, Object> params) {
        try {
            //ut.begin();
            Query q = em.createNativeQuery(query);
            setParameters(q, params);
            return q.executeUpdate();
        } finally {
        }
    }

    public Object merge(Object o) {
        return em.merge(o);
    }

    public void refresh(Object o) {
        em.refresh(o);
    }

    public void detach(Object o) {
        em.detach(o);
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public Object find(Class clazz, Object id) {
        // TODO Auto-generated method stub
        return em.find(clazz, id);
    }
}

Иногда мне нужно обновить данные нативным sql, чтобы myapp запустил код:
public int executeNativeUpdate(String query, Map<String, Object> params)

И я получил эту ошибку:

javax.ejb.EJBTransactionRolledbackException: Executing an update/delete query
  at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleInCallerTx(CMTTxInterceptor.java:139)
  at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:204)
  at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:306)
  at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:190)
  at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
  at org.jboss.as.ejb3.remote.EJBRemoteTransactionPropagatingInterceptor.processInvocation(EJBRemoteTransactionPropagatingInterceptor.java:80)
  at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
  at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
  at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
  at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59)
  at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
  at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
  at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
  at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:32)
  at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
  at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
  at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
  at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
  at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165)
  at org.jboss.as.ejb3.remote.LocalEjbReceiver.processInvocation(LocalEjbReceiver.java:179)
  at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:179)
  at org.jboss.ejb.client.TransactionInterceptor.handleInvocation(TransactionInterceptor.java:43)
  at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)
  at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:128)
  at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)
  at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136)
  at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121)
  at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104)
  at $Proxy80.executeNativeUpdate(Unknown Source)

Как я могу сделать собственное обновление SQL в JPA/JTA.

0 ответов

Другие вопросы по тегам