EntityManagerFactory + jpadaosupport的依赖注入问题

时间:2010-01-16 18:13:33

标签: java spring jpa dependency-injection

现在我在将一个entityFactoryManager注入我的jpadaosupport扩展类时遇到了问题。

我的配置如下:

<bean id="productDao" class="springapp.repository.JdbcProductDao">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

此bean的上述配置工作正常,但是当我尝试使用注释来配置bean时,我的应用程序不起作用

我的JdbcProductDao.java文件位于

之下
@Repository("productDao")
@Transactional
public class JdbcProductDao extends JpaDaoSupport implements ProductDao {

    @SuppressWarnings("unchecked")
    @Override
    public List<Product> getProductList() {
        // TODO Auto-generated method stub
        return getJpaTemplate().getEntityManagerFactory().createEntityManager()
                .createQuery("from Product").getResultList();
    }

    @Override
    public void persist(Product product) {
        // TODO Auto-generated method stub

    }

    @Override
    public void saveProduct(Product prod) {
        // TODO Auto-generated method stub
        getJpaTemplate().merge(prod);
    }

    @Autowired
    @Required
    public void setJpaEntityManagerFactory(
            @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        super.setEntityManagerFactory(entityManagerFactory);
    }
}

然而,似乎没有正确注入EntityManagerFactory,因为没有看到我的数据库事务

有人可以提供任何见解吗?

5 个答案:

答案 0 :(得分:2)

你的bean配置文件中有这样的行吗?

    <context:component-scan base-package="com.noisyair.whatisayis.web"/>

这告诉spring在某个包中查找带注释的类。

答案 1 :(得分:2)

要使用@Transactional注释,是否已将行<tx:annotation-driven/>添加到Spring配置

有关所有详细信息,请参阅9.5.6. Using @Transactional中的Chapter 9, Transaction management部分。

答案 2 :(得分:1)

您是否申报了交易经理?

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

答案 3 :(得分:1)

关注Pascal's tips后,您可能会解决您的问题。

但是我根据您的代码提出了另一条建议:

  • 如果您要使用JpaDaoSupport,请使用JpaTemplate方法。
  • 如果您想直接使用EntityManager,请通过@PersistenceContext注入,不要使用JpaDaoSupport

调用createEntityManager()可能会破坏spring的事务处理。这是因为事务管理器创建了以后使用的当前EntityManager。如果你自己创建它,你可能最终会有两个不同的EntityManager s - 一个正在进行的交易,一个 - 不是。

答案 4 :(得分:0)

您宣布了哪​​位交易经理?知道这可能会暗示一下。

您如何测试交易?当你说“我看不到我的数据库事务”时,你的意思是你是INSERTing对象,但你的数据库没有变化?

有任何错误消息或例外吗?

如果您在调试器中单步执行代码,您认为发生了什么?

确保在CLASSPATH中有Log4J JAR和配置XML。我发现Spring在启动时在控制台中输出了大量信息。你需要看到这一点,以便更好地了解正在发生的事情。确保应用程序上下文正在查找您的bean。还有很多其他方便的信息。没有它,你就会失明。