2015-02-20 28 views
5

Korzystałem z programowego zarządzania transakcjami na wiosnę, teraz przełączyłem się na zarządzanie transakcjami deklaratywnymi.Wiosenne zarządzanie transakcjami nie działa

SessionFactory

<beans:bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <beans:property name="dataSource" ref="dataSource" /> 
     <beans:property name="packagesToScan" value="com.hcentive.cig.domain" /> 
     <beans:property name="hibernateProperties"> 
      <beans:props> 
       <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop> 
       <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect 
       </beans:prop> 
       <beans:prop key="hibernate.show_sql">true</beans:prop> 
       <beans:prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</beans:prop> 
      </beans:props> 
     </beans:property> 
    </beans:bean> 

TransactionManager

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

Teraz Jeśli uruchomić mój kod

@Override 
    @Transactional 
    public Request saveRequest(Request request) { 
     sessionFactory.getCurrentSession().save(request); 
     return request; 
    } 

otrzymuję wyjątek oszczędzania nie jest ważny bez aktywnej transakcji

jeśli usunąć poniżej linii

<beans:prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</beans:prop> 

uzyskać

No CurrentSessionContext skonfigurowany!

+2

Czy masz '' –

+0

rzucić okiem na te odpowiedzi: http://stackoverflow.com/a/4396530/280244 – Ralph

+0

[Zobacz tutaj] (http: // stackoverflow.com/a/25910635/3364187) – Xstian

Odpowiedz

1

pewno nie trzeba tego ustawienia:

<beans:prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</beans:prop> 

warstwa Wiosna Transaction Management powinno wiązać Session hibernacji do aktualnego biegu wątek.

ustawienia są w porządku, jedyną rzeczą, która może spowodować, że pochodzi z tego zestawienia Ciebie:

nie jest uzyskiwanie wywołana z warstwą usług, a także próbowałem przesuwając @ transakcyjnych do obsługi warstwy

trzeba odsłonić tę metodę:

Request saveRequest(Request request); 

poprzez interfejs usługi, które wstrzyknąć dowolny inny składnik (sieć lub inne fasole warstwy usług).

Aby to sprawdzić, można wprowadzić punkt przerwania debugowania w implementacji metody saveRequest i poszukać stosu wywołań dla TransactionInterceptor. Jeśli go tam nie ma, Spring nie może owijać wywołania metody w logikę przetwarzania aspektu transakcji.

0

Posiadanie funkcji oznaczonej jako transakcyjna niekoniecznie wystarcza. Należy również upewnić się, że:

  • Twój fasola zostanie utworzony poprzez sprężynę (zdefiniowanej jako @Component stwierdzona przez componentScan lub zadeklarowana w konfiguracji xml)
  • Odniesienie do fasoli musi być uzyskane poprzez wstrzyknięcie zależności Wiosna
1

Aby być skutecznym, musisz powiedzieć kontekstowi wiosny, z którego chcesz skorzystać. Adnotacje bez procesora dla tej adnotacji są całkiem bezużyteczne.Aby włączyć procesor dla adnotacji @Transactional dodaj do swojego kontekstu <tx:annotation-driven />. (Jak wyjaśniono w przewodniku referencyjnym here).

Twoja konfiguracja hibernacji jest również problematyczna przy korzystaniu ze Springa, nie powinieneś mieszać się z właściwością konfiguracyjną hibernate.current_session_context_class (chyba że używasz jakiegoś określonego dostawcy JTA, ale najwyraźniej nie jesteś). Jeśli zaczniesz ustawiać tę właściwość, przerwiesz właściwą integrację sprężyny dla zarządzania transakcjami. Wiosna już ustawia tę właściwość dla ciebie i twoje ustawienie zastępuje domyślną.

Twoja konfiguracja powinna wyglądać mniej więcej tak.

<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <beans:property name="packagesToScan" value="com.hcentive.cig.domain" /> 
    <beans:property name="hibernateProperties"> 
     <beans:props> 
      <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop> 
      <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</beans:prop> 
      <beans:prop key="hibernate.show_sql">true</beans:prop> 
     </beans:props> 
    </beans:property> 
</beans:bean> 

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

<tx:annotation-driven />