【问题标题】:Hibernate JPA Transaction not active error while running TestCases but works fine when executed in main Class运行 TestCases 时出现 Hibernate JPA Transaction not active 错误,但在主类中执行时工作正常
【发布时间】: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


【解决方案1】:

嘿,我发现错误是导入问题。 而不是使用 javax.transaction.Transactional 我正在使用 com.google.inject.persist.Transactional

因此,当我们使用 google.inject.persist.transaction 时,事务未处于活动状态。然后当有人尝试提交或刷新任何事务时,它会出现异常。

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多