2012-10-17 11 views
6

Ho incontrato il problema dell'elemento persistente nel database utilizzando EntityManager. Sulla base delle risposte che ho trovato, ho provato quei 4 modi nel mio DaoJpa per fare una cosa del genere, ma ancora fallita. Qui ho attaccato i quattro modi che ho provato:EntityManager non può utilizzare persist per salvare l'elemento nel database

Codice in parte controller:

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

1. DaoJpa:

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

non funziona!

2.

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

Eccezione ho ottenuto: nessuna transazione è in corso

3.

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

Eccezione ho ottenuto: non autorizzati a creare transazione su EntityMa condiviso nager - uso Primavera transazioni o EJB CMT invece

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

Eccezione ho ottenuto: L'applicazione deve fornire connessioni JDBC

Qualcuno potrebbe aiutarmi a capire il problema per favore? Molte grazie in anticipo!

Molte grazie l'aiuto di JustinKSU. Aggiungo l'annotazione nel contesto di primavera e poi è stata risolta! Ecco la versione precedente del mio contesto Primavera:

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

Dopo aggiunto il

<tx:annotation-driven /> 

funziona:

<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

Hai provato a utilizzare @Transactional sul metodo persist? – JustinKSU

+0

Scusa se ho dimenticato di menzionarlo nel post. Sì, ho aggiunto @Transactional prima del metodo in tutti e quattro i modi. Inoltre ho provato ad aggiungere (readOnly = true)/(readOnly = false) dopo l'annotazione Transactional, e anche aggiunto (propagation = Propagation.REQUIRED), ma non sembra differenza. –

+0

Si sta utilizzando @PersistenceContext per iniettare l'entityManager? – JustinKSU

risposta

9

Per abilitare @Transactional nel vostro contesto primavera si dovrebbe avere la seguente:

Appropriato per la tua versione di Primavera:

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

abilitare le annotazioni:

<tx:annotation-driven /> 

dichiarare il vostro gestore delle transazioni iniettando il vostro gestore di entità:

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

Ho trovato che l'annotazione nel mio contesto di primavera è così: dovrei averne modificato qualsiasi in questo ? –

+3

Prova a rimuovere il parametro mode andando con la modalità predefinita = "proxy" – JustinKSU

+0

Wow Grazie mille @JustinKSU Ora risolvo il problema! È esattamente il problema delle annotazioni! Forse dovrei allegare il contenuto del mio contesto di primavera qui sotto per aiutare altri che potrebbero incontrare anche problemi simili. Comunque, molte molte grazie per il vostro aiuto gentile! –

1

Se avete ancora questo problema e tutte le configurazioni sono ok, assicuratevi che il metodo annotato @Transaction è pubblico, non protetto per essere identificato/gestito dal gestore delle transazioni.

+0

Come per i frammenti di codice nel post di OP tutti i metodi sono ' public'. Inoltre afferma che quando aggiunto '' risolve il problema. Non vedo la tua risposta aggiungendo nulla alla discussione. – bhantol

+2

Forse questa risposta potrebbe aiutare altri sviluppatori?! – Criss

Problemi correlati