我有这个类,它致力于通过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的数据
我刚刚遇到这个问题,现在我已经解决了。但我意识到我是如此愚蠢。
我发现的原因是我要提交的数据有一个外键但是我忘记了,所以事务总是会自己关闭。我在数据库中添加外键,然后测试或主方法运行成功。
我想说的关键点是,请在您的代码中写入此内容。
} catch (Exception ex) {
ex.printStackTrace();
tx.rollback();}
您将很容易找到交易关闭或不存在的原因。那是我的经验,希望有用!
对于可能收到以下错误消息的其他人:“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;
}
可能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()。如果启用了上述配置,如何管理事务。