2012-10-17 29 views
6

EntityManager'ı kullanarak veritabanına kalıcı olarak devam etme sorunuyla karşılaştım. Bulduğum cevaplara dayanarak, DaoJpa'mda bu 4 şeyi denedim ama böyle bir şey yapmaya devam ettim ama hala başarısız oldu. Denetleyici kısmenEntityManager öğesi veritabanına kaydetmek için sürekli kullanamazsınız

Kod:

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

1. DaoJpa:

Çalışmaz

@Transactional 
public void persist(SmartProduct smartProduct) { 
      entityManager.persist(smartProduct); 
Burada dört Denedim yollarını bağlı!

2.

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

İstisna aldım: oluşturmak için izin verilmez: Hiçbir işlem sürüyor aldım

3.

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

İstisna olan paylaşılan EntityMa üzerinde işlem Nager - Kullanım Bahar işlemleri ya da EJB CMT aldığım yerine

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

İstisna:

biri bana anlamaya yardım eder misin JDBC bağlantıları

sağlamalısınız uygulama sorun lütfen? Şimdiden çok teşekkürler!

Çok teşekkürler JustinKSU'nun yardımı. Ek açıklamayı Bahar bağlamına ekledim ve sonra çözdüm! İşte benim Bahar bağlamda önceki sürümüdür:

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

eklendi sonra

<tx:annotation-driven /> 

çalışır: Eğer olması gereken

<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

Kalıcı yöntemde @ Transactional kullanmayı denediniz mi? – JustinKSU

+0

Üzgünüz, yazıdan bahsetmeyi unuttum. Evet Yöntemden önce tüm dört yolla Transactional ekledim. Ayrıca İşlemsel ek açıklamadan sonra (readOnly = true)/(readOnly = false) eklemeyi ve hatta (propagation = Propagation.REQUIRED) eklemeyi denedim, ancak hiçbir fark yok gibi görünüyor. –

+0

EntityManager'ı enjekte etmek için @PersistenceContext kullanıyor musunuz? – JustinKSU

cevap

9

sizin Bahar bağlamında @Transactional etkinleştirmek için izleyen:

Bahar sürümü için uygun:

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

etkinleştirme açıklamalar:

<tx:annotation-driven /> 

senin varlık yöneticisi enjekte işlem yöneticisi bildirin: Bu sorunu hala var ve tüm konfigürasyonlar tamamsa

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

İlkbahar içeriğindeki ek açıklamanın şu şekilde olduğunu buldum: Bu konuda herhangi bir değişiklik yapmalıyım ? –

+3

Varsayılan modda gitmeye çalışırken mod parametresini kaldırmayı deneyin = "proxy" – JustinKSU

+0

Wow Çok teşekkürler @JustinKSU Şimdi sorunu çözüyorum! Tam olarak ek açıklama sorunu var! Belki de benzer sorunla karşılaşabilecek başkalarına yardım etmek için bahar bağlamımın içeriğini iliştirmeliyim. Neyse, nazik yardımınız için çok teşekkürler! –

1

, emin olun İşlem bildirimi yöntemi, işlem yöneticisi tarafından tanımlanabilmesi/yönetilmesi için korunmayan, herkese açık açıklamalı bir yöntemdir.

+0

OP'in gönderdiği kod snippet'lerine göre tüm yöntemler şunlardır: kamuoyunu. Ayrıca eklendiğinde '' problemi çözdüğünü belirtir. Cevabınızı tartışmaya bir şey eklediğini göremiyorum. – bhantol

+2

Belki bu cevap diğer geliştiricilere yardımcı olabilir? – Criss

İlgili konular