Получение транзакции не удалось успешно запустить исключение с помощью Spring Hibernate - PullRequest
5 голосов
/ 20 сентября 2011

У меня есть объект UserProfile, который мне нужно сохранить.после сохранения сущности в базе данных я получаю следующее исключение:

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

Также, когда я вижу таблицу, сущность сохраняется вместо отката!

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

I 'Я использую диспетчер транзакций hibernate

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

и моя конфигурация hibernate:

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

Может кто-нибудь пож.скажи мне, что здесь происходит?

Ответы [ 2 ]

10 голосов
/ 20 сентября 2011

Я думаю, что вы стали жертвой двойного управления транзакциями.Если вы используете Spring Transaction Management и Hibernate Transaction Management вместе в одном проекте, вы, скорее всего, столкнетесь с этой проблемой.

Тогда ваш код должен быть либо:

Вариант 1. Управление транзакциями в спящем режиме

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

или Опция 2. Управление транзакциями Spring

@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;
    }
}
0 голосов
/ 15 июля 2015

Также может возникнуть конфликт между org.springframework.orm.hibernate3.HibernateTemplate и org.hibernate.Session.

Если вы работаете над старым проектом, вы можете обнаружить, что используется HibernateTemplate.

Если вы создадитеВ новом DAO с более новым способом работы, таким как Session в hibernate, и с использованием обоих DAO для одной и той же функции, вы найдете эту ошибку.

Решение : используйте одно или другое,В моем случае мне пришлось использовать HibernateTemplate, чтобы не изменять все остальное старой программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...