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>
Czy próbowałeś używać @Transactional w metodzie persist? – JustinKSU
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. –
Czy używasz @PersistenceContext do wstrzyknięcia entityManager? – JustinKSU