交易未激活 – Hibernate – JPA
我有这个类专门用于通过hibernate的persistance层在db中保存数据。
public class TLinkEquipementDAOImpl implements TLinkEquipementDAO { private static final Log log = LogFactory .getLog(TLinkEquipementDAOImpl.class); @PersistenceContext private EntityManagerFactory emf = PersistenceManager.getInstance() .getEntityManagerFactory(); private EntityManager entityManager = emf.createEntityManager(); private EntityTransaction tx = entityManager.getTransaction(); public void persist(TLinkEquipement transientInstance) { log.debug("persisting TLinkEquipement instance"); try { tx.begin(); entityManager.persist(transientInstance); tx.commit(); log.debug("persist successful"); } catch (RuntimeException re) { tx.rollback(); log.error("persist failed", re); throw re; } } //Staff }
问题是它不会持久存储数据。
堆栈是:
Exception in thread "main" java.lang.IllegalStateException: Transaction not active at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:82) at sau.se.domain.dao.Impl.TLinkEquipementDAOImpl.persist(TLinkEquipementDAOImpl.java:47) at sau.se.domain.service.Impl.TLinkEquipementServiceImpl.persist(TLinkEquipementServiceImpl.java:29) at sau.se.extractor.InfoExtract.getAllSPData(InfoExtract.java:346) at sau.se.extractor.InfoExtract.main(InfoExtract.java:436)
但我必须指出,它在其他类中工作正常。
更新 :
当我打印tx.isActive()
它给了我false
。
UPDATE
我试图更多地获得有关错误的信息:
我遇到了问题所在:
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: sau.se.domain.model.TLinkEquipement.TEquipementsByIdEquipement2 -> sau.se.domain.model.TEquipements at org.hibernate.engine.CascadingAction$9.noCascade(CascadingAction.java:376)
事实上,表TLinkEquipement
有两个fk到同一个表TEquipements
,而我,我坚持TEquipements
数据然后是TLinkEquipement
可能tx.begin()
抛出exception。 这意味着在catch
子句中没有活动事务来回滚。 这就是tx.rollback()
抛出另一个exception(遮蔽原始错误)的原因。
要查看源exception,请重写catch
块:
} catch (RuntimeException re) { log.error("persist failed", re); //moved to top tx.rollback(); throw re; }
也不是说你在这里混合概念。 一方面,您正在声明注入的实体管理器( @PersistenceContext
),另一方面您正在以编程方式使用EntityManagerFactory
创建。
如果这是一个JEE bean,它应该如下所示:
@Stateless public class TLinkEquipementDAOImpl implements TLinkEquipementDAO { private static final Log log = LogFactory.getLog(TLinkEquipementDAOImpl.class); @PersistenceContext private EntityManager entityManager; public void persist(TLinkEquipement transientInstance) { log.debug("persisting TLinkEquipement instance"); entityManager.persist(transientInstance); log.debug("persist successful"); } //Staff }
这里,事务管理和实体管理器管理由容器(应用程序服务器)处理。
如果在类容器之外使用此类,那么我可能看起来像这样:
public class TLinkEquipementDAOImpl implements TLinkEquipementDAO { private static final Log log = LogFactory.getLog(TLinkEquipementDAOImpl.class); //I'm assuming getEntityManagerFactory() returnes an already created EMF private EntityManagerFactory emf = PersistenceManager.getInstance() .getEntityManagerFactory(); private EntityManager entityManager = emf.createEntityManager(); public void persist(TLinkEquipement transientInstance) { EntityTransaction tx = entityManager.getTransaction(); log.debug("persisting TLinkEquipement instance"); try { tx.begin(); entityManager.persist(transientInstance); tx.commit(); log.debug("persist successful"); } catch (RuntimeException re) { log.error("persist failed", re); if(tx.isActive()) { tx.rollback(); } throw re; } } //Staff }
对于其他可能会出现此错误的人:“线程中的exception”主“java.lang.IllegalStateException:事务处于非活动状态”
检查合并操作。 您可能正在尝试合并一个应该是引用的对象而不是刚刚创建的对象。 通过引用,我的意思是……您需要从数据库中对该对象进行实时引用…因此“事务处于非活动状态”错误消息。
以下是使用JPQL从数据库查询对象的示例代码:
public static Users getUserByName(EntityManager em, String name) throws NoResultException, Exception { Users user = null; user = em.createQuery("SELECT u from Users u WHERE u.name =:name", Users.class).setParameter("name", name).setMaxResults(1).getSingleResult(); return user; }
我刚遇到这个问题,现在我已经解决了。 但我意识到我是如此愚蠢。
我找到的原因是我要提交的数据有一个外键但我忘记了,所以事务总是关闭自己。 我在数据库中添加了外键,然后test或main方法成功运行。
我想说的关键点是请在你的代码中写下这个。
} catch (Exception ex) { ex.printStackTrace(); tx.rollback();}
并且您将很容易找到交易关闭或不活动的原因。 那是我的经历,希望有用!
我正在使用Hibernate 5.3.1.Final和Weblogic 12.2.1.2 ,我通过以下persistence.xml配置解决了这个问题:
org.hibernate.jpa.HibernatePersistenceProvider ${wls.datasource}
- Junit:为删除实体的方法编写测试?
- 如何使用hibernate.properties文件而不是hibernate.cfg.xml
- Hibernate持久化Map 而不引用另一个表
- Hibernate Criteria查询:获取具有m..n关系的对象列表,其中子表没有特定属性
- Hibernate中的错误简单示例初学者级别
- Hibernate无法启动
- org.hibernate.MappingNotFoundException:resource:*找不到hbm.xml
- 使用相同的数据透视表对具有子类的多对多进行hibernate
- Spring 3 MVC Hibernate 3.5.4 hibernateTemplate没有关闭连接(非事务性)