Не может выполнить собственное обновление в 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.