2017-05-10 2 views
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()

+0

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 –

+0

Vielen Dank. Das war hilfreich für mich. Schließlich ersetze ich einfach JTA durch "RESOURCE_LOCAL" in diesem Code in der persistence.xml:

+0

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. –

Antwort

0

Schließlich einfach ersetzt JTA "mit 'RESOURCE_LOCAL' ich in diesem Quellcode in der Datei persistence.xml:

Verwandte Themen