繁体   English   中英

Glassfish 4-使用Hibernate和CDI @Transactional的TransactionRequiredException

[英]Glassfish 4 - TransactionRequiredException using Hibernate and CDI @Transactional

我收到以下异常:

javax.el.ELException: javax.persistence.TransactionRequiredException
at com.sun.el.parser.AstValue.invoke(AstValue.java:279)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)

Caused by: javax.persistence.TransactionRequiredException
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTxRequiredCheck(EntityManagerWrapper.java:161)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTransactionScopedTxCheck(EntityManagerWrapper.java:151)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:299)

我正在使用Hibernate 4.3.5

@Named
@SessionScoped
public class MenuBean implements Serializable {

   @PersistenceContext
   private EntityManager entityManager;

   @Transactional
   public void create() {
       MenuTitle menu = new MenuTitle();
       menu.setLabel(label);
       entityManager.persist(menu); //exception in this line
       label = null;
   }

持久性XML:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="MyPersistenceUnit" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>MySQL5</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.current_session_context_class" value="jta"/>
        <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>
        <property name="hibernate.hbm2ddl.auto" value="none"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
    </properties>
</persistence-unit>

我也尝试将hibernate.transaction.jta.platform设置为org.hibernate.engine.transaction.jta.platform.internal.SunOneJtaPlatform但它会导致相同的错误。

EJB CMT´s的运行正常。

从命令按钮调用创建动作:

<p:commandButton value="Create" process="@this type" update=":megaMenuForm:mainMenu" actionListener="#{menuBean.create()}" oncomplete="closeMenuDialog(xhr, status, args)"/>  

如果要管理事务,请参阅EJB规范。 注入资源UserTransaction。 由于您正在使用EJB,因此@Transactional在这里什么也不做。
通常,您的示例应该可以工作,并且@Transactional批注将被忽略。 您可以尝试创建一个接口,并通过该接口调用create方法吗? 看起来您正在使用EJB 2样式编码,但是Glassfish 4实现了EJB 3.1,因此最好使用新的EJB 3.1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM