복붙노트

[SPRING] @Transactional in Spring + 최대 절전 모드

SPRING

@Transactional in Spring + 최대 절전 모드

내 웹 응용 프로그램에서 Spring 3.1 + Hibernate 4.x를 사용하고 있습니다. 내 DAO에서 다음과 같이 사용자 유형 개체를 저장합니다.

sessionFactory.getCurrentSession().save(user);

하지만 다음과 같은 예외 :

org.hibernate.HibernateException: save is not valid without active transaction

내가 봤 거든 비슷한 솔루션에 다음과 같은 질문을 발견 :

   Session session=getSessionFactory().getCurrentSession();
   Transaction trans=session.beginTransaction();
   session.save(entity);
   trans.commit();

그것으로 문제가 해결됩니다. 그러나이 솔루션에서는 수동으로 트랜잭션을 시작하고 커밋하는 것이 쉽지 않습니다.

sessionFactory.getCurrentSession ()을 사용할 수 없습니다. save (user); 수동으로 트랜잭션을 시작 / 커밋하지 않고 직접?

나는 내 서비스 / DAO 메소드에서도 @Transactional을 사용하려고 시도하지만 문제는 지속된다.

편집 : 여기 내 봄 구성 파일 :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:p="http://www.springframework.org/schema/p"
     xmlns:aop="http://www.springframework.org/schema/aop"
     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.1.xsd
     http://www.springframework.org/schema/tx
     http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">


  <!-- enable the configuration of transactional behavior based on annotations -->
  <tx:annotation-driven transaction-manager="txManager"/>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        p:driverClassName="${db.driverClassName}" p:url="${db.url}"
        p:username="${db.username}" p:password="${db.password}" />

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="com.myapp.entities" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>


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

</beans>

나는 다음과 같은 Hibernate 4 의존성을 사용하고있다.

<!-- Hibernate Dependency -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.1.7.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.1.1.Final</version>
        </dependency>

        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>${cglib.version}</version>
            <scope>runtime</scope>
        </dependency>

도와주세요.

해결법

  1. ==============================

    1.난 당신이 응용 프로그램 컨텍스트 파일에서 최대 절전 모드 3 트랜잭션 관리자를 사용하는 이유는 당신이 하이버 네이트 4.x를 사용하는 것 같아?

    난 당신이 응용 프로그램 컨텍스트 파일에서 최대 절전 모드 3 트랜잭션 관리자를 사용하는 이유는 당신이 하이버 네이트 4.x를 사용하는 것 같아?

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

    나는 그것이 있어야한다고 생각한다.

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

    작동시킬 @Transactional 속성과 함께 최대 절전 모드 4 트랜잭션 관리자를 사용해보십시오.

  2. ==============================

    2.기본적으로 applicationContext.xml 파일에서 Hibernate 속성에 대한 다음 줄을 제거해야합니다.

    기본적으로 applicationContext.xml 파일에서 Hibernate 속성에 대한 다음 줄을 제거해야합니다.

    <prop key="hibernate.current_session_context_class">thread</prop>
    

    이것이 제거되면, Hibernate는 트랜잭션 관리를 위해 Spring을 사용한다.

    너에게 행운을 비네.

  3. ==============================

    3.Spring XML의 작업 버전과 @Transactional annotated DAO 클래스를 사용하여 Spring XML에서 DAO를 정의하고 있습니까? (아마 프로토 타입으로) 만약 당신이 아니라면, 내가 볼 수있는 한, 당신의 DAO는 트랜잭션면에서 AOP 될 것입니다. 나는 그것이 가장 쉬운 방법이라고 생각한다. 이 예제는 Spring 3 Doc, 10.5.6 Using @Transactional에서 발췌 한 것입니다.

    Spring XML의 작업 버전과 @Transactional annotated DAO 클래스를 사용하여 Spring XML에서 DAO를 정의하고 있습니까? (아마 프로토 타입으로) 만약 당신이 아니라면, 내가 볼 수있는 한, 당신의 DAO는 트랜잭션면에서 AOP 될 것입니다. 나는 그것이 가장 쉬운 방법이라고 생각한다. 이 예제는 Spring 3 Doc, 10.5.6 Using @Transactional에서 발췌 한 것입니다.

      <!-- this is the service object that we want to make transactional -->
      <bean id="fooService" class="x.y.service.DefaultFooService"/>
    
      <!-- enable the configuration of transactional behavior based on annotations -->
      <tx:annotation-driven transaction-manager="txManager"/>
    

    ... 당신은 DAO를 DefaultFooService로 대체 할 수 있습니다.

  4. from https://stackoverflow.com/questions/13066017/transactional-in-springhibernate by cc-by-sa and MIT license