0
Dies sind die in den Fehlern verwickelt Klassen (Ich bin nicht die Entreprise Java Beans verwenden):Fehler: Ein JTA EntityManager kann nicht verwendet werden getTransaction()
@WebListener
public class EMF implements ServletContextListener {
private static EntityManagerFactory emf;
private final String PERSISTENCE_UNIT_NAME = "ldnr";
@Override
public void contextInitialized(ServletContextEvent event) {
Map<String, String> properties = new HashMap<>();
properties.put("javax.persistence.jdbc.user", "root");
properties.put("javax.persistence.jdbc.password", "1234512345");
emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, properties);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
emf.close();
}
public static EntityManager createEntityManager() {
if (emf == null) {
throw new IllegalStateException("Context is not initialized yet.");
}
return emf.createEntityManager();
}
}
package fr.ldnr.daoImpl;
Dies ist die Klasse der Entität Manager.
public abstract class DAOFactoryImpl implements DAOFactory {
private final EntityManager em;
public DAOFactoryImpl() {
em = EMF.createEntityManager();
}
@Override
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void save(Object o) throws Exception {
em.getTransaction().begin();
em.persist(o);
em.flush();
em.clear();
em.close();
}
@Override
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Object update(Object o) throws Exception {
o = em.merge(o);
em.flush();
em.clear();
em.close();
return o;
}
@Override
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Object find(Class myClass, long id) throws Exception {
Object o = em.find(myClass, id);
em.clear();
em.close();
return o;
}
@Override
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public List<Object> findAll(Class myClass) throws Exception {
List<Object> objectsList = em.createQuery("select * from " + myClass.getClass().getSimpleName()).getResultList();
return objectsList;
}
@Override
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void delete(Object o) throws Exception {
em.remove(o);
em.flush();
em.clear();
em.close();
}
@Override
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Object queryObject(String query) throws Exception {
Object o = em.createQuery(query).getSingleResult();
em.flush();
em.clear();
em.close();
return o;
}
@Override
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public List<Object> queryObjects(String query) throws Exception {
List<Object> objectsList = em.createQuery(query).getResultList();
em.flush();
em.clear();
em.close();
return objectsList;
}
@Override
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public long count(Class entityClass) throws Exception {
Object o = em.createQuery("select count(*) from " + entityClass.getSimpleName());
em.clear();
em.close();
return (Long) o;
}
Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
return properties;
}
}
So ist die Ausnahme: Ein JTA EntityManager kann nicht verwendet werden getTransaction()
Verwenden Sie daher nicht getTransaction(), wie die Nachricht sagt, da dies eine "lokale Ressource" -Transaktion ist. Sie können eine JTA-Transaktion mit anderen Mitteln (z. B. JNDI) erhalten http://www.datanucleus.org/products/accessplatform_5_1/jpa/persistence.html#transaction_jta –
Vielen Dank. Das war hilfreich für mich. Schließlich ersetze ich einfach JTA durch "RESOURCE_LOCAL" in diesem Code in der persistence.xml: –
JTA hätte gut funktioniert. Die Zeile 'em.getTransaction(). Begin();' ist vollständig redundant, da Sie Container Managed Transactions (CMT) verwenden. Ich erwarte jedoch, dass Sie auf andere Probleme stoßen werden. –