Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Glassfish 4-TransactionRequiredException使用Hibernate和CDI@Transactional_Java_Hibernate_Glassfish 4_Jpa 2.1 - Fatal编程技术网

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

Java Glassfish 4-TransactionRequiredException使用Hibernate和CDI@Transactional,java,hibernate,glassfish-4,jpa-2.1,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.ForwardingMethodE

我得到以下异常:

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)
<?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 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:

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)
<?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>

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

您如何测试它?你在哪里注入你的菜单bean?还有,你有没有试过用@Model代替SessionScoped?我在菜单栏中没有看到任何必须保持活动状态的会话状态。我正在从commandButton actionListener调用菜单栏,请参阅更新的问题。继续,在SessionScoped上尝试@Model注释,然后发布结果。(除非你在MenuBean中真的有东西要保持活力)同样,你确定你没有在拦截器中的create方法中完成事务吗?分享这些代码对你很有用,我在上面的例子中没有看到任何EJB。我正在将新的JEE7样式与CDI和@Transactional annotation一起使用。顺便说一句,您是否可以尝试使用@Stateless而不是SessionScope?我已经尝试过了。这也导致了同样的例外。我认为hibernate存在一些配置问题。Glassfish默认使用EclipseLink,但我希望使用hibernate搜索进行全文搜索。