2012-03-15 53 views
2

我真的不使用JPA ...所以这更像是一个基本的问题使用JPA2一个实体更新

我用JPA2 - (不冬眠)

我有这样的功能,我要让我的

@RequestScoped // (this is javax.faces.bean.RequestScoped) 
@Stafeful // (this is javax.ejb.Stateful) 
public class MyProvider { 


    @Inject 
    private EntityManager entityManager; 

    /* some variables and getters and setters */ 

    public void setLocked(Long id, boolean locked) { 
     entityManager.getTransaction().begin(); 
     user = userProvider.findUserByID(id); 
     user.setLocked(locked); 
     entityManager.persist(user); 

     // i also tried it with refresh instead of persist 
     entityManager.refresh(user); 

     entityManager.getTransaction().commit(); 
    } 
} 

的更新,但我在这一点上 entityManager.getTransaction()得到这个错误开始()。

java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction() 
    org.hibernate.ejb.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:996) 
    org.jboss.as.jpa.container.AbstractEntityManager.getTransaction(AbstractEntityManager.java:498) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:601) 
    org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:264) 
    org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52) 
    org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137) 
    org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:260) 
    org.jboss.weld.bean.builtin.CallableMethodHandler.invoke(CallableMethodHandler.java:51) 
    org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56) 
    org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:105) 
    org.jboss.weldx.persistence.EntityManager$-1570536921$Proxy$_$$_Weld$Proxy$.getTransaction(EntityManager$-1570536921$Proxy$_$$_Weld$Proxy$.java) 
    de.demoapp.controller.UserController.setLocked(UserController.java:452) 
    de.demoapp.controller.UserController.lock(UserController.java:721) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:601) 
    org.apache.el.parser.AstValue.invoke(AstValue.java:262) 
    org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) 
    org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39) 
    org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) 
    com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) 
    com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
    javax.faces.component.UICommand.broadcast(UICommand.java:315) 
    javax.faces.component.UIData.broadcast(UIData.java:1093) 
    javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
    javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62) 

我也看过this文章 - 但它并不能真正帮助,但它仍然抛出:javax.persistence.TransactionRequiredException: no transaction is in progress

我不知道如果我做一些必要的错......

回答

3

是,有一些重大错误。您在容器管理的事务和用户管理的事务之间不匹配。为EntityManager.getTransaction文档讲述很清楚是什么问题:

抛出:
IllegalStateException - 如果在JTA实体管理器调用

问题来自于entityManager.getTransaction()您代码,用/ flush/persist /等攻击并不重要,因为异常发生在这些行被执行之前。可从发现

这个话题的更多细节:http://en.wikibooks.org/wiki/Java_Persistence/Transactions

1

没关系,因为米克的真正好回答的,我这样做是知情权:

我输入:

import javax.ejb.TransactionAttribute; 
import static javax.ejb.TransactionAttributeType.REQUIRED; // this one is important!!! 

我的注解现在:

@RequestScoped 
@Stateful 
@TransactionAttribute(value=REQUIRED) 
public class UserProvider { 

    public void setLocked(Long id, boolean locked) { 
     User user = new User(); 
     user = findUserByID(id); 
     user.setLocked(locked); 
     entityManager.merge(user); 
     } 
    } 

现在它的工作原理,但REA儿子是第二次进口和​​otation!