2011-09-20 8 views
5

Tengo una entidad de perfil de usuario que debo guardar. después de salvar a la entidad en la base de datos, me sale el siguiente excepción:Obtención de la excepción de transacción no iniciada utilizando Spring Hibernate

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

también cuando veo la mesa de la entidad se conserva en lugar de hacer una operación de deshacer!

@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; 
    } 
} 

estoy usando administrador de transacciones de hibernación

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

y mi hibernación de configuración es:

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

Puede alguien pl. dime que esta pasando aqui?

+0

'@ user354161' ver respuesta editada y comentario de' Bozho' – Bitmap

Respuesta

10

Creo que ha sido víctima de gestiones de doble transacción. Si usa Spring Transaction Management y Hibernate Transaction Management juntos en el mismo proyecto, es más probable que tenga este problema.

su código a continuación, establecidos:

Opción 1.gestión de transacciones de Hibernate

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 Opción 2.gestión de transacciones primavera

@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, use @Transactional o .beginTransactional(). Además, las transacciones de primavera no admiten el cambio del nivel de aislamiento – Bozho

+0

Las transacciones de primavera admiten cambios en el nivel de aislamiento, pero solo en 'DataSourceTransactionManager'. También hay una clase contenedora, 'org.springframework.jdbc.datasource.IsolationLevelDataSourceAdapter' que podría usar en el administrador de Hibernate tx. Pero, si necesita diferentes niveles de aislamiento en diferentes lugares, debe gestionar administradores de Hibernate TX por separado, lo que se puede hacer con AOP pero no con la anotación '@ Transactional'. – AngerClown

+0

¡Gracias chicos !, ¡funcionó para mí ahora! Utilicé la opción 2 sugerida por @Bitmap. Con solo una corrección en la opción 2, también necesitamos eliminar la instrucción session.close() como sessionFactory.getCurrentSession() cierra la sesión automáticamente. Cuando tuve la declaración session.close() recibí org.hibernate.SessionException: ¡La sesión está cerrada! excepción. ¡Gracias de nuevo! – tintin

0

También podría haber un conflicto entre org.springframework.orm.hibernate3.HibernateTemplate y org.hibernate.Session.

Si está trabajando en un proyecto antiguo, puede encontrar HibernateTemplate en uso.

Si crea un nuevo DAO con una forma más nueva de hacer las cosas, como hibernate Session, y utiliza ambos DAO en la misma función, encontrará este error.

Solución: Utilice una u otra. En mi caso tuve que usar HibernateTemplate para no cambiar todo el resto de un programa anterior.

Cuestiones relacionadas