Hibernate 4 Spring 4 Не удалось получить сеанс с синхронизацией транзакций для текущего потока

1
@Repository
public class Init {

    public static void main(String[] args) {

        Init init = new Init();
        init.addUser(init.getSessionFactory());

    }

    private SessionFactory getSessionFactory() {
        ApplicationContext context = new ClassPathXmlApplicationContext(
            new String[] { "Spring_Hibernate.xml" });

        SessionFactory sf = (SessionFactory) context.getBean("sessionFactory");

        return sf;
    }

    @Transactional
    private void addUser(SessionFactory sf) {
        Session session = sf.getCurrentSession();

        User user = new User();
        user.setName("123");
        session.save(user);
        session.close();
        sf.close();
    }
}

XML:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.warmmer.bean" />
    <property name="hibernateProperties">
        <!-- <value> hibernate.dialect=org.hibernate.dialect.HSQLDialect </value> -->
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.format_sql">true</prop>

            <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> 
        </props>
    </property>
</bean>


<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

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

<tx:annotation-driven transaction-manager="txManager" />

err: INFO: Использование DataSource [org.apache.commons.dbcp.BasicDataSource@6098b14d] из Hibernate SessionFactory для HibernateTransactionManager Исключение в потоке "main" org.hibernate.HibernateException: не удалось получить синхронизированный с транзакцией сеанс для текущего потока

Если: hibernate.current_session_context_class установить 'thread'

затем: сохранение недействительно без активной транзакции

что мне делать, пожалуйста?

Теги:
spring
hibernate

1 ответ

1
Лучший ответ

Вы не создаете объект "Init" в контексте весны, поэтому весна никогда не получит возможность обернуть прокси-сервер вокруг метода аннотацией, которая будет управлять транзакцией

Попробуйте изменить свой класс на...

package my.pkg;
// Imports etc

@Repository
public class Init {

    @Autowired
    private SessionFactory sessionFactory;

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
            new String[] { "Spring_Hibernate.xml" });
        Init init = context.getBean(Init.class);
        init.addUser();
    }

    @Transactional
    private void addUser() {
        Session session = sessionFactory.getCurrentSession();

        User user = new User();
        user.setName("123");
        session.save(user);
        // session.close(); DON'T NEED THESE!
        // sf.close();
    }
}

Теперь вам может потребоваться добавить следующее в ваш файл beans, чтобы он нашел ваш репозиторий...

<context:component-scan base-package="my.pkg"/>
  • 0
    Не могу вспомнить, будет ли @Transactional работать для частных методов, если нет, попробуйте сделать метод общедоступным ...
  • 0
    Исключение в потоке "main" org.springframework.orm.hibernate4.HibernateSystemException: запрошен неизвестный сервис [org.hibernate.stat.spi.StatisticsImplementor]; вложенное исключение: org.hibernate.service.UnknownServiceException: неизвестный запрос службы [org.hibernate.stat.spi.StatisticsImplementor] в org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException (SessionFactoryUtils.java:)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню