Je développe une petite application pour mon auto-apprentissage dans struts2, ejb et JPA (Hibernate en tant que fournir) avec le serveur d'application comme Wildfly 10. J'essaie de configurer JTA pour gérer les transactions avec le récipient. Voici mon codeImpossible de faire fonctionner les transactions CMT
Business Service EJB()
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class BusinessService implements BusinessRemote {
@EJB
Dao bDao;
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void updateAll(){
try {
dao.saveAll(xyz);
} catch (Exception e) {
e.printstacktrace();
}
try {
dao.updateAll();
} catch (Exception e) {
e.printstacktrace();
}
}
}
DaoImpl (EJB)
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class DaoImpl implements Dao {
@PersistenceContext(unitName="db")
private EntityManager entityManager;
public void saveAll(xyz) {
entityManager.persist(xyz);
}
public void updateAll() {
Query query = entityManager.createNamedQuery("getQuery.ById");
query1.executeUpdate();
}
}
persistence.xml
<persistence-unit name="db" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:/DB</jta-data-source>
<properties>
<property name="javax.persistence.jdbc.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.transaction.jta.platform" value="org.hibernate.engine.transaction.jta.platform.internal.JBossStandAloneJtaPlatform" />
<property name="hibernate.current_session_context_class" value="jta"/>
<property name="hibernate.transaction.factory_class" value="org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl" />
</properties>
</persistence-unit>
Mais je reçois ci-dessous trace de la pile lorsque updateAll
méthode est exécuté.
javax.persistence.TransactionRequiredException: Executing an update/delete query
Il semble que lorsque la requête de mise à jour est déclenchée, aucune transaction active n'est présente. Lorsque j'essaie d'exécuter la méthode saveAll
seulement alors rien n'est enregistré dans la base de données bien que je ne reçoive aucune exception. Si j'essaie de vider les changements, cela donne une exception ci-dessous. Cela signifie que, dans le scénario ci-dessus, le conteneur n'initie aucune transaction. Il semble qu'il manque quelque chose dans mes configurations que je ne trouve pas.