使用JPA / JTA / JBOSS / CDI不会持久保存对象

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

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(); } } } 

但是如果我使用@Stateless注释(Now 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中

     java:jboss/datasources/MysqlXADS false           

用于调用Repository以将对象持久保存到数据库的服务类

  public class OrganizationServiceImpl implements OrganizationService { @Inject private OrganizationRepository orgRepo; public Response createOrganization(InputStream is) { Organization org = null; org = readStream(is); orgRepo.save(org); return Response.created(URI.create("/organizations/" + org.getId())) .build(); } private Organization readStream(InputStream is) { JAXBContext context; Organization org = null; try { context = JAXBContext.newInstance(Organization.class); Unmarshaller um = context.createUnmarshaller(); org = (Organization) um.unmarshal(is); } catch (JAXBException e) { e.printStackTrace(); } return org; } } 

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

当您没有使用@Stateless方法注释类时,默认情况下不是事务性的,因此您会得到上述exception。

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

 tx = em.getTransaction(); tx.begin(); // do some work ... tx.commit();