Java 对象未使用JPA/JTA/JBOSS/CDI持久化

Java 对象未使用JPA/JTA/JBOSS/CDI持久化,java,jakarta-ee,jpa,jboss7.x,jta,Java,Jakarta Ee,Jpa,Jboss7.x,Jta,请帮助我理解为什么下面的代码不能持久化对象。它抛出javax.persistence.TransactionRequiredException:JBAS011469:执行此操作需要事务(使用事务或扩展持久性上下文) 但是,如果我用@Stateless注释(现在是ejb)注释这个类,对象就会开始持久化 @Stateless public class OrganizationRepositoryImpl implements OrganizationRepository {

请帮助我理解为什么下面的代码不能持久化对象。它抛出javax.persistence.TransactionRequiredException:JBAS011469:执行此操作需要事务(使用事务或扩展持久性上下文)

但是,如果我用@Stateless注释(现在是ejb)注释这个类,对象就会开始持久化

@Stateless    
public class OrganizationRepositoryImpl implements OrganizationRepository {

            @PersistenceContext(unitName="usermanagement",type=PersistenceContextType.TRANSACTION)
            private EntityManager em;

            public void save(Organization organization) {
                try {
                    em.persist(organization);
                }catch(Exception e) {
                    e.printStackTrace();

                }
            }    
        }
persistence.xml

    <?xml version="1.0" encoding="UTF-8"?>
<persistence 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://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
        version="2.1">
    <persistence-unit name="usermanagement" transaction-type="JTA">
        <jta-data-source>java:jboss/datasources/MysqlXADS</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
             <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
             <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
             <property name="hibernate.show_sql" value="true"/>
             <property name="hibernate.format_sql" value="true"/>  
             <property name="use_sql_comments" value="true"/>
             <property name="jboss.entity.manager.factory.jndi.name" value="java:jboss/myEntityManagerFactory" /> 
        </properties>
    </persistence-unit>
</persistence>

当您将bean声明为无状态时,默认情况下该bean中的方法是事务性的。事务性方法在完全执行时提交持久性状态


当您没有使用
@Stateless
方法对类进行注释时,默认情况下,这些方法不是事务性的,因此您会得到提到的异常。

当您将bean声明为
@Stateless
时,默认情况下,该bean中的方法是事务性的。事务性方法在完全执行时提交持久性状态


当您没有使用
@无状态
方法对类进行注释时,默认情况下,这些方法不是事务性的,因此您会得到提到的异常。

我对EJB不太熟悉,但我相信问题是,如果没有@Stateless注释,bean就不是EJB,因此事务不会自动管理。如果需要有状态性,请使用@Stateful注释创建有状态EJB。如果您不想使用EJB,您必须像这样使用EntityManager手动管理事务

tx = em.getTransaction();
tx.begin();

// do some work
...

tx.commit();

我对EJB不太熟悉,但我相信问题在于没有@Stateless注释,bean就不是EJB,因此事务不会自动管理。如果需要有状态性,请使用@Stateful注释创建有状态EJB。如果您不想使用EJB,您必须像这样使用EntityManager手动管理事务

tx = em.getTransaction();
tx.begin();

// do some work
...

tx.commit();

这是真的,那么我如何使它成为bean的事务性方法,而不使bean成为EJB(@Stateless)。我尝试用@Transactional(vale=TxType=Required)注释方法,但仍然得到相同的异常。另一天,另一个注释有一个没有明确记录的其他行为。这是真的,那么我如何使它成为bean的事务性方法,而不使bean成为EJB(@Stateless)。我尝试用@Transactional(vale=TxType=Required)注释方法,但仍然得到相同的异常。
tx = em.getTransaction();
tx.begin();

// do some work
...

tx.commit();