2011-10-06 65 views
0

我只是努力實現一個基本的web應用Spring + Hibernate的EntityManager的的EntityManager由Spring注入,但空在第一次使用

設置我的刀和上下文完全按照這個帖子描述: http://blog.springsource.com/2006/08/07/using-jpa-in-spring-without-referencing-spring/

併爲其創建了一個測試,如下所示: http://lstierneyltd.com/blog/development/examples/unit-testing-spring-apps-with-runwithspringjunit4classrunner-class/

由於某些原因,當我試圖訪問entitymanager來創建查詢時,它的null。

但是,從entitymanager的setter方法內部設置斷點,我可以看到Spring正在注入它,並且該字段正在初始化。

任何線索爲什麼在setter返回後entitymanager可能會被取消?

編輯: 的DAO代碼我在哪裏設置斷點:

public class ProductDaoImpl implements ProductDao { 

private EntityManager entityManager; 

@PersistenceContext 
public void setEntityManager(EntityManager entityManager) { 
    this. entityManager = entityManager; 
} 

public Collection loadProductsByCategory(String category) { 
    return entityManager.createQuery("from Product p where p.category = :category") 
     .setParameter("category", category).getResultList(); 
} 
} 
+0

閱讀更多關於交易的測試可以請我們請參閱試圖使用實體管理器的代碼。你確定當你斷點setter時你正在看同一個對象實例嗎? –

+0

@Alex我添加了上面的代碼,我在setEntityManager()中設置了斷點。本地(this.entityManager)爲空,但它所設置的參數值已正確初始化。然而,當我在loadProductsByCategory()方法內部破解時,局部變量回到null –

+0

我們是否還可以看到正在使用此DAO的測試? –

回答

0

,我想你確實有<tx:annotation-driven/>,告訴Spring把事務通知對上有一個@Transactional註解的類或方法它。

交易應的服務/業務層上定義,因此您的ProductDaoImpl通常是從服務,@Transactional中調用。例如

pubic class ProductService { 

    @Resource(...) // inject it the way you like e.g. @Autowired/Setter/Constructor injection, etc.. 
    ProductDao yourProductDao; 

    @Transactional 
    public List<Product> findCarProducts { 
     yourProductDao.loadProductsByCategory("car"); 
    } 
} 

(或者,你可以使用一個基於XML的事務配置)

我們您的DAO實際的通話將within交易=>這是EntityManager的/ Hibernate的Session非常重要。否則,您會看到所有常見錯誤:例如entityManager爲null,entityManager關閉等。

如果您想單獨測試DAO,您必須確保您的測試用例通過@TransactionConfiguration包裝在事務中。例如,如果你的事務管理器bean定義爲:

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

你的DAO測試將包括這個bean的名字:

@ContextConfiguration 
@TransactionConfiguration(transactionManager="txManager", defaultRollback=false) 
public class ProductDaoTransactionalTests { 
    // your use cases here.. 
} 

可以在Spring Documentation

+0

也是,因爲您使用了多個示例,請確保所有上下文文件都導入到您在測試中加載的單個應用上下文中。 – tolitius

+0

Bah,覺得很愚蠢,我在實際的DAO類上有一個@Transactional,並且刪除那個+將它移動到測試中解決了這個問題。謝謝! –

相關問題