2012-03-15 52 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!