EntityManager не может использовать persist для сохранения элемента в базе данных

я столкнулся с проблемой сохранения элемента в базе данных с помощью EntityManager. Основываясь на ответах, которые я нашел, я попробовал эти 4 способа в моем DaoJpa, чтобы сделать это, но все равно не удалось. Здесь я приложил четыре способа, которые я пробовал:

код в части контроллера:

   @Transactional 
   SmartProduct smartProduct = new SmartProduct();
            smartProduct.setName("Dove Soap");
            smartProductDao.persist(smartProduct);

1. Даоджпа:

 @Transactional
 public void persist(SmartProduct smartProduct) {
            entityManager.persist(smartProduct);

не работает!

2.

@Transactional
public void persist(SmartProduct smartProduct) {
entityManager.persist(smartProduct);
entityManager.flush();

исключение, которое я получил: Нет транзакции прогресс!--9-->

3.

@Transactional
public void persist(SmartProduct smartProduct) {
EntityTransaction emTransaction = entityManager.getTransaction();
        emTransaction.begin();  
        entityManager.persist(smartProduct);
        emTransaction.commit();
        entityManager.close();

исключение у меня: Не разрешено создавать транзакции в общем EntityManager-использовать Spring транзакции или EJB CMT вместо

4.

@Transactional
public void persist(SmartProduct smartProduct) {
                    EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit");
                EntityManager em = emf.createEntityManager();
                EntityTransaction etx = em.getTransaction();
                etx.begin();
                em.persist(smartProduct);
                etx.commit();
                em.close();
                emf.close();

исключение у меня: Приложение должно предоставлять соединения JDBC

может кто-нибудь помочь мне выяснить проблему, пожалуйста? Большое спасибо заранее!

большое спасибо JustinKSU помощь. Я добавляю аннотацию в весеннем контексте, а затем она решена! Вот предыдущая версия моего весеннего контекста:

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

    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
        <property name="persistenceUnitName" value="persistenceUnit" />
        <property name="dataSource" ref="dataSource" />
    </bean>

после добавления

<tx:annotation-driven />

работает:

<tx:annotation-driven />
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
        <property name="persistenceUnitName" value="persistenceUnit" />
        <property name="dataSource" ref="dataSource" />
    </bean>

2 ответов


чтобы включить @Transactional в вашем весеннем контексте, вы должны иметь следующее:

подходит для вашей версии Spring:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

включить аннотации:

<tx:annotation-driven />

объявите, что ваш менеджер транзакций вводит ваш entity manager:

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

Если у вас все еще есть эта проблема, и все конфигурации в порядке, убедитесь, что аннотированный метод @Transaction является общедоступным, не защищенным для идентификации/управления менеджером транзакций.