2012-10-17 10 views
6

Napotkałem problem utrzymywania elementu w bazie danych za pomocą EntityManager. Opierając się na odpowiedziach, które znalazłem, próbowałem tych 4 sposobów w moim DaoJpa, aby zrobić coś takiego, ale wciąż nie udało mi się. Tu załączeniu cztery sposoby ja próbowałem:EntityManager nie może użyć elementu persist do zapisania elementu w bazie danych

kod kontrolera część:

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

1. DaoJpa:

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

nie działa!

2.

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

Wyjątek mam: no transakcja jest w toku

3.

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

Wyjątek mam: Nie wolno tworzyć transakcja na wspólnym EntityMa nager - wykorzystanie Wiosna transakcji lub EJB CMT zamiast

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(); 

Wyjątek mam: Wniosek musi dostarczyć JDBC połączenia

Może ktoś mi pomóc dowiedzieć się problem proszę? Z góry bardzo dziękuję!

Wielkie dzięki pomocy JustinKSU. Dodaję adnotację w kontekście Wiosennym, a następnie rozwiązano! Oto poprzednia wersja mojego kontekście wiosennego:

<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> 

Po dodał

<tx:annotation-driven /> 

to działa:

<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> 
+1

Czy próbowałeś używać @Transactional w metodzie persist? – JustinKSU

+0

Przepraszam, że zapomniałem wspomnieć o tym we wpisie. Tak, dodałem @Transactional przed metodą na wszystkie cztery sposoby. Próbowałem również dodać (readOnly = true)/(readOnly = false) po adnotacji transakcyjnej, a nawet dodać (propagacja = propagacja.REQUIRED), ale wydaje się, że nie ma różnicy. –

+0

Czy używasz @PersistenceContext do wstrzyknięcia entityManager? – JustinKSU

Odpowiedz

9

Aby włączyć @Transactional w kontekście wiosennego należy mieć podążając za:

Odpowiedni dla posiadanej wersji 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"> 

Włącz adnotacje:

<tx:annotation-driven /> 

zadeklarować menedżera transakcji wstrzykiwanie swojego kierownika jednostki:

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

Stwierdziłem, że adnotacja w moim kontekście wiosennym jest następująca: powinienem zmodyfikować dowolny w tym ? –

+3

Spróbuj usunąć parametr trybu w trybie domyślnym = "proxy" – JustinKSU

+0

Wow Dziękuję bardzo @JustinKSU Rozwiązuję problem już teraz! To właśnie problem z adnotacjami! Może powinienem dołączyć treść mojego kontekstu wiosennego poniżej, aby pomóc innym, którzy mogą również spotkać podobny problem. W każdym razie, wiele dzięki za życzliwą pomoc! –

1

Jeśli nadal masz ten problem i wszystkie konfiguracje są ok, upewnij się, że metoda adnotacji @Transaction jest publiczna, nie jest chroniona w celu identyfikacji/zarządzania przez menedżera transakcji.

+0

Zgodnie z fragmentami kodu w poście PO wszystkie metody są ' publiczne ". Ponadto stwierdza, że ​​po dodaniu '' rozwiązuje problem. Nie widzę odpowiedzi, która dodaje coś do dyskusji. – bhantol

+2

Może ta odpowiedź może pomóc innym programistom?! – Criss

Powiązane problemy