![](/img/trans.png)
[英]CDI + JPA + EJB + JTA + JSF --JBoss-Kitchen Example with PostgreSQL?
[英]Object is not getting persisted using 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批注(現在為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>
服務類調用存儲庫以將對象持久存儲到數據庫中
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中的方法是事務性的。 事務方法在完全執行時會提交持久狀態。
當您沒有用@Stateless
方法注釋的類時,默認情況下不會進行事務處理,因此您會遇到上述異常。
我對EJB不太熟悉,但是我相信問題在於,如果沒有@Stateless批注,則bean不是EJB,因此不會自動管理事務。 如果需要有狀態,請使用@Stateful批注創建有狀態EJB。 如果您不想使用EJB,則必須像這樣使用EntityManager手動管理事務。
tx = em.getTransaction();
tx.begin();
// do some work
...
tx.commit();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.