Проблема внедрения зависимостей с EntityManagerFactory + jpadaosupport - PullRequest
2 голосов
/ 16 января 2010

Сейчас у меня проблема с внедрением entityFactoryManager в мой расширенный класс jpadaosupport.

Моя конфигурация ниже:

<bean id="productDao" class="springapp.repository.JdbcProductDao">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</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 ]

2 голосов
/ 16 января 2010

Чтобы использовать аннотацию @Transactional, добавили ли вы строку <tx:annotation-driven/> в конфигурацию Spring ?

См. Раздел 9.5.6. Использование @ Transactional в главе , Управление транзакциями для всех деталей.

2 голосов
/ 16 января 2010

У вас есть такая строка в вашем файле конфигурации бина?

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

Это говорит Spring, чтобы искать аннотированные классы в некотором пакете.

1 голос
/ 16 января 2010

Следуя советам Паскаля , вы, вероятно, решите свою проблему.

Однако у меня есть еще один совет, основанный на вашем коде:

  • , если вы собираетесь использовать JpaDaoSupport, используйте методы JpaTemplate.
  • если вы хотите использовать EntityManager напрямую, введите его через @PersistenceContext и не используйте JpaDaoSupport

Вызов createEntityManager() может нарушить обработку транзакции пружины. Это связано с тем, что менеджер транзакций создает текущий EntityManager, который позже используется. Если вы создадите его самостоятельно, у вас может получиться 2 разных EntityManager с - один с текущей транзакцией, а другой - нет.

1 голос
/ 16 января 2010

Вы объявили менеджер транзакций?

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
0 голосов
/ 16 января 2010

Какой менеджер транзакций вы объявили? Знание этого может дать намек.

Как вы тестируете транзакции? Когда вы говорите «ни одна из моих транзакций с базой данных не видна», вы имеете в виду, что вы ВСТАВЛЯЕТЕ объекты, но ваша база данных не изменилась?

Есть ли сообщения об ошибках или исключения?

Если вы просматриваете код в отладчике, что вы видите?

Убедитесь, что в вашей CLASSPATH есть JAR Log4J и XML-файл конфигурации. Я обнаружил, что Spring выдает огромное количество информации в консоль при запуске. Вы должны увидеть это, чтобы иметь лучшее представление о том, что происходит. Убедитесь, что контекст приложения находит ваши компоненты. Также будет много другой полезной информации. Без этого ты летишь вслепую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...