【发布时间】:2014-09-30 13:30:00
【问题描述】:
我正在尝试使用 jpa 持久性以及通过 EntityManager 的 Guice 注入在 Hibernate 中插入一个实体对象。 当我尝试使用 oject 条目反映在我的数据库中的主类插入对象时,它工作正常。 但是当我执行我的 Junit testCases 时,它向我显示错误:“java.lang.IllegalStateException: Transaction not active”,而插入 db Remaining 方法正常工作。
============== AbstractHibernateRepository<T> Class==================
@Inject
private EntityManager em;
public AbstractHibernateRepository(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected EntityManager getEntityManager() {
return this.em;
}
@Transactional
public T create(T entity) {
EntityManager entityManager = getEntityManager();
if (!entityManager.getTransaction().isActive())
entityManager.getTransaction().begin();
try {
entityManager.persist(entity);
if (entityManager.getTransaction().isActive()){
entityManager.getTransaction().commit();
}
else
entityManager.flush();
} catch (Exception e) {
System.out.println("======>>>>>");
if (entityManager.getTransaction().isActive())
entityManager.getTransaction().rollback();
e.printStackTrace();
}
return entity;
}
================================
================== AvailableServerRepository.class ==============
public class AvailableServerRepository extends
AbstractHibernateRepository<AvailableServerEntity> implements
IAvailableServerRepository {
@Override
public AvailableServerEntity insertAvailableServer(
AvailableServerEntity availableServer) {
return create(availableServer);
}
}
====================================
public class AvailableServerRepositoryTest {
private static Injector injector = null;
private static PersistenceInitializer initializer = null;
@BeforeClass
public static void environmentSetup() {
injector = Guice.createInjector(new MainModule(), new JpaPersistModule(
"proplet-indexer"));
initializer = injector.getInstance(PersistenceInitializer.class);
initializer.startServer();
}
@AfterClass
public static void environmentClean() {
if(initializer != null)
initializer.stopServer();
}
/**
* Test of insertAvailableServer method, of class AvailableServerRepository.
*/
@Test
public void testInsertAvailableServer() {
AvailableServerRepository availableServerRepository = injector
.getInstance(AvailableServerRepository.class);
AvailableServerEntity availableServer = createAvailableServer();
assertNotNull(availableServerRepository.insertAvailableServer(availableServer));
}
====================================
Error while it throws while running testCases is
java.lang.IllegalStateException: Transaction not active
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:70)
at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:87)
at com.exzeo.indexer.persistence.repository.impl.AvailableServerRepository.insertAvailableServer(AvailableServerRepository.java:34)
at com.exzeo.indexer.persistence.repository.impl.AvailableServerRepositoryTest.testInsertAvailableServer(AvailableServerRepositoryTest.java:56)
【问题讨论】:
-
发布完整的堆栈跟踪
-
Hey Chaitanya 它在执行测试用例时只显示此消息
-
你可以找到我的解决方案at this address。
标签: hibernate jpa dependency-injection transactions guice