当前位置: 首页 > 知识库问答 >
问题:

事务不活动-Hibernate-JPA

颜高朗
2023-03-14

我有这个类,它致力于通过hibernate的持久层将数据持久化。

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。

更新

我试图获取有关错误的更多信息:

我找到了问题所在:

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)

事实上,表tlinkEquipment在同一个表中有2个fk,我保存了TEquipements的数据,然后保存了TEquipements的数据

共有3个答案

孟凯泽
2023-03-14

我刚刚遇到这个问题,现在我已经解决了。但我意识到我是如此愚蠢。

我发现的原因是我要提交的数据有一个外键但是我忘记了,所以事务总是会自己关闭。我在数据库中添加外键,然后测试或主方法运行成功。

我想说的关键点是,请在您的代码中写入此内容。

} catch (Exception ex) {
ex.printStackTrace();
tx.rollback();}

您将很容易找到交易关闭或不存在的原因。那是我的经验,希望有用!

贺宜修
2023-03-14

对于可能收到以下错误消息的其他人:“Exception in thread”main“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;
}
司空昊阳
2023-03-14

可能tx.begin()抛出了一个异常。这意味着在cat子句中没有要回滚的活动事务。这就是为什么tx.rollback()抛出了另一个异常(隐藏原始错误)。

要查看源异常,请重写您的cat块:

} 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
}

 类似资料:
  • java.lang.IllegalStateException:org.hibernate.transientPropertyValueException:object引用了一个未保存的瞬态实例-在刷新之前保存瞬态实例:entity.customer.passport->entity.passport 注意:如果我在实体类中使用CascadeType.Persist,我可以在DB中插入另一行。

  • 问题内容: 我有一个专门用于通过hibernate的持久层将数据持久保存在db中的类。 问题在于它不会持久保存数据。 堆栈是: 但我必须指出,它在其他课程中也能正常工作。 更新 : 当我印刷它给我的时候。 更新 我试图获得更多有关该错误的信息: 我知道问题出在哪里: 实际上,该表对同一张表有2 fk ,而我,我坚持的是 问题答案: 可能引发了异常。这意味着该子句中没有要回滚的活动事务。这就是为什么

  • 问题涉及的方法是: 编辑。以下是完整的堆栈跟踪(一些消息是西班牙语的):

  • 在db会话监视器中,当这种情况发生时,我得到了一个不活动的事务。 我得到的错误如下: 问题是交易和连接应该自动打开和关闭...我希望并发修改失败的事务得到回滚...但似乎他们变得不活跃了。

  • 我有一个带有唯一约束的字段'nom'的表,当我测试插入表中已经存在的该字段的值时,会抛出org.hibernate.exception.ConstraintViolationExcure。然后在我坚持之后,我得到了一个事务已经活动的异常。 这是我在Dao类中的持久化方法 这里是我捕获异常的代码 如何解决此事务问题?

  • 我在Hibernate中看到了以下属性。cfg。一个企业(EJB)应用程序中的xml。我不知道这到底意味着什么。 我在代码中没有找到任何与事务相关的东西,比如begin transaction或commit,相反,我只看到sessionFactory。openSession()和会话。flush()。如果启用了上述配置,如何管理事务。