错误:JTA EntityManager不能使用getTransaction() [英] Error: A JTA EntityManager cannot use getTransaction()

查看:181
本文介绍了错误:JTA EntityManager不能使用getTransaction()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这些是涉及错误的类(我没有使用Entreprise Java Beans):

  @WebListener 
public class EMF实现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();

$ b $ public static EntityManager createEntityManager(){
if(emf == null){
throw new IllegalStateException(Context is not initialized yet。);
}

return emf.createEntityManager();
}

}

包fr.ldnr.daoImpl;

这是使用实体管理器的类。

  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()()开始。
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 { b $ b Object o = em.find(myClass,id);
em.clear();
em.close();
return o;
}

@Override
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public List< Object> findAll(Class myClass)抛出Exception {
List< Object> objectsList = em.createQuery(select * from+ myClass.getClass()。getSimpleName())。getResultList();
返回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)抛出Exception {
List< Object> objectsList = em.createQuery(query).getResultList();
em.flush();
em.clear();
em.close();
返回objectsList;

$ b @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;


属性additionalProperties(){
属性properties = new Properties();
properties.setProperty(hibernate.dialect,org.hibernate.dialect.MySQLDialect);
返回属性;
}

}

所以,例外是:A JTA EntityManager不能使用getTransaction()解决方案

最后,我简单地用'RESOURCE_LOCAL'替换'JTA'中的源代码中的持久性.xml文件:


These are the classes implicated in the error (I'm not Using The Entreprise Java Beans):

@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;

This is the class using the entity 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, the exception is: A JTA EntityManager cannot use getTransaction()

解决方案

Finally I simply replaced 'JTA' with 'RESOURCE_LOCAL' in this source code in the persistence.xml file:

这篇关于错误:JTA EntityManager不能使用getTransaction()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆