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 - 使用 Hibernate 和 CDI @Transactional 的 TransactionRequiredException
使用Windows 10在Eclipse ee上的Glassfish 4的位置