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

Posted

技术标签:

【中文标题】Glassfish 4 - 使用 Hibernate 和 CDI @Transactional 的 TransactionRequiredException【英文标题】:Glassfish 4 - TransactionRequiredException using Hibernate and CDI @Transactional 【发布时间】:2014-06-13 17:47:26 【问题描述】:

我收到以下异常:

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)"/>  

【问题讨论】:

你如何测试这个?你在哪里注入你的 Menu bean? 另外,您是否尝试过使用@Model 而不是 SessionScoped?我没有在 MenuBean 中看到任何需要保持活动状态的会话状态。 我正在从 commandButton actionListener 调用 menuBean,请参阅更新后的问题。 继续在 SessionScoped 上尝试 @Model 注释并发布结果。 (除非你真的有东西可以在 MenuBean 中保持活力) 另外,你确定你没有在拦截器中完成你的 create 方法中的事务吗?分享该代码对您很有用。 【参考方案1】:

如果您想管理事务,请参阅 EJB 规范。注入资源 UserTransaction。 由于您使用的是 EJB,所以 @Transactional 也在这里不做任何事情。 通常,您的示例应该可以工作,并且 @Transactional 注释将被忽略。你能尝试做一个接口,并通过它调用create方法吗? 看起来您使用的是 EJB 2 风格的编码,但 Glassfish 4 实现了 EJB 3.1,所以最好使用新的。

【讨论】:

我在上面的例子中没有看到任何 EJB。我正在使用带有 CDI 和 @Transactional 注释的新 JEE7 样式。 顺便说一句,你可以尝试使用@Stateless 代替 SessionScoped 我已经尝试过了。它导致了同样的异常。我认为hibernate存在一些配置问题。 Glassfish 默认使用 EclipseLink,但我想使用 hibernate-search 进行全文搜索。

以上是关于Glassfish 4 - 使用 Hibernate 和 CDI @Transactional 的 TransactionRequiredException的主要内容,如果未能解决你的问题,请参考以下文章

Glassfish 4没有资源的密码凭据

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

使用Windows 10在Eclipse ee上的Glassfish 4的位置

Glassfish 4.1.2 JVM无法启动退出代码127

Eclipse开发中GlassFish 4 重启页面不刷新

无法启动GlassFish 4.0(Windows) - 端口1527 - 已在使用的地址