错误:JTA EntityManager不能使用getTransaction() [英] Error: A JTA EntityManager cannot use getTransaction()
本文介绍了错误: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屋!
查看全文