2011-09-20 10 views
5

Ho un'entità Profilo utente che ho bisogno di salvare. dopo aver salvato l'entità nel database, ottengo la seguente eccezione:Ottenere transazione non è stata avviata correttamente utilizzando Spring Hibernate

Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started 

Anche quando vedo la tabella l'entità è persisteva invece di fare un rollback!

@Transactional(isolation=Isolation.REPEATABLE_READ) 
public class HibernateUserProfileDAO implements UserProfileDAO { 
    private org.hibernate.SessionFactory sessionFactory; 
    public UserProfile getUserProfile(int userId) { 
     org.hibernate.classic.Session session = sessionFactory.getCurrentSession(); 
     session.beginTransaction(); 
     UserProfile userProfile = new UserProfile(); 
     userProfile.setUserName("sury1"); 
     session.save(userProfile); 
     session.getTransaction().commit(); 
     session.close(); 
     return userProfile; 
    } 
} 

Sto usando Hibernate transazione direttore

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

e il mio hibernate config:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan" value="com.springheatmvn.domain"/> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.connection.pool_size">10</prop> 
      <prop key="hibernate.connection.show_sql">true</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property>  
</bean> 

Può chiunque pl. dimmi cosa sta succedendo qui?

+0

'@ user354161' vedere risposta modificata e commento da' Bozho' – Bitmap

risposta

10

Penso che tu sia caduto vittima di una doppia gestione delle transazioni. Se si utilizza Spring Transaction Management e Hibernate Transaction Management insieme nello stesso progetto, è più probabile che si verifichi questo problema.

Il codice quindi dovrebbero essere:

Opzione 1.Hibernate gestione delle transazioni

public class HibernateUserProfileDAO implements UserProfileDAO { 
    private org.hibernate.SessionFactory sessionFactory; 
    public UserProfile getUserProfile(int userId) { 
     org.hibernate.classic.Session session = sessionFactory.getCurrentSession(); 
     session.beginTransaction(); 
     UserProfile userProfile = new UserProfile(); 
     userProfile.setUserName("sury1"); 
     session.save(userProfile); 
     session.getTransaction().commit(); 
     session.close(); 
     return userProfile; 
    } 
} 

o Opzione 2.Primavera transazione Gestione

@Transactional 
public class HibernateUserProfileDAO implements UserProfileDAO { 
    private org.hibernate.SessionFactory sessionFactory; 
    public UserProfile getUserProfile(int userId) { 
     org.hibernate.classic.Session session = sessionFactory.getCurrentSession(); 
     UserProfile userProfile = new UserProfile(); 
     userProfile.setUserName("sury1"); 
     session.save(userProfile); 
     session.close(); 
     return userProfile; 
    } 
} 
+1

yup, utilizzare @Transactional o .beginTransactional(). Inoltre, le transazioni primaverili non supportano la modifica del livello di isolamento. – Bozho

+0

Le transazioni Spring supportano le modifiche al livello di isolamento, ma solo in 'DataSourceTransactionManager'. C'è anche una classe wrapper, 'org.springframework.jdbc.datasource.IsolationLevelDataSourceAdapter' che è possibile utilizzare nel gestore tx di Hibernate. Ma, se avevi bisogno di diversi livelli di isolamento in posti diversi, devi gestire gestori di Hibernate TX separati, che possono essere eseguiti con AOP ma non con l'annotazione '@ Transactional'. – AngerClown

+0

Grazie ragazzi !, ha funzionato per me ora !!! Ho usato l'opzione 2 suggerita da @Bitmap. Solo una correzione nell'opzione 2, dobbiamo anche rimuovere l'istruzione session.close() mentre sessionFactory.getCurrentSession() chiude automaticamente la sessione. Quando ho avuto la dichiarazione session.close() ho ottenuto org.hibernate.SessionException: la sessione è chiusa! eccezione. Grazie ancora! – tintin

0

Potrebbe anche essere un conflitto tra org.springframework.orm.hibernate3.HibernateTemplate e org.hibernate.Session.

Se si sta lavorando su un vecchio progetto, è possibile trovare HibernateTemplate in uso.

Se si crea un nuovo DAO con un nuovo modo di fare le cose, come l'ibernazione Session e si utilizzano entrambi i DAO sulla stessa funzione, si troverà questo errore.

Soluzione: utilizzare uno o l'altro. Nel mio caso ho dovuto usare HibernateTemplate per non cambiare tutto il resto di un vecchio programma.

Problemi correlati