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

时间:2014-06-13 17:47:26

标签: java hibernate glassfish-4 jpa-2.1

我收到以下异常:

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工作正常。

从commandButton调用Create动作:

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

1 个答案:

答案 0 :(得分:-1)

如果要管理事务,请参阅EJB规范。注入资源UserTransaction。 此外@Transactional在这里没有做任何事情,因为你正在使用EJB 一般来说,您的示例应该可以工作,而@Transactional注释将被忽略。你能尝试创建一个接口,并通过它调用create方法吗? 看起来您正在使用EJB 2样式编码,但Glassfish 4实现了EJB 3.1,因此最好使用新的。