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>
Hai provato a utilizzare @Transactional sul metodo persist? – JustinKSU
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. –
Si sta utilizzando @PersistenceContext per iniettare l'entityManager? – JustinKSU