【发布时间】:2013-11-20 13:07:52
【问题描述】:
我有这个类,专门通过hibernate的持久层将数据持久化到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。
更新
我试图获取更多有关错误的信息:
我知道问题出在哪里了:
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 的表有 2 个 fk 到同一个表TEquipements,而我,我坚持TEquipements 的数据然后是TLinkEquipement 的数据
【问题讨论】: