2010-07-20 11 views
26

Na czym polega ten błąd? "Żadna sesja hibernacji nie jest powiązana z wątkiem, a konfiguracja nie pozwala na utworzenie nie-transakcyjnej tutaj". Mój plik konfiguracyjny wiosny wygląda mniej więcej tak.Brak sesji hibernacji związanej z wątkiem, a konfiguracja nie pozwala na utworzenie nie-transakcyjnej tutaj

<bean id="jndiDataSource" 
    class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>java:/devDS</value> 
    </property> 
</bean> 
<bean id="stsaDBFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="jndiDataSource" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>xx.yy.zz.User</value> 
      <value>xx.yy.UserResponse</value> 

     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbmddl.auto">create</prop> 
     </props> 
    </property> 
</bean> 

<!-- ################################### Aspects ################################################## --> 

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

Wszystkie przechodzi testy DAO podczas badania ich na zewnątrz z pojemnika za pomocą junit. Kiedy wdrażam go w jBoss jako aplikację portalu, otrzymuję ten wyjątek. Działa również dobrze, jeśli usunę konfigurację specyficzną dla portalu i sprawię, że będzie to prosta aplikacja internetowa i wdrożona na jboss.Any pomysł?

+0

Zobacz także http://stackoverflow.com/questions/734614/spring-hibernate-junit-no-hibernate-session-bound-to-thread – Vadzim

Odpowiedz

35

Zdefiniowałeś menedżera transakcji w swojej konfiguracji wiosna, ale próbujesz wykonać kwerendę hibernacji w metodzie, która nie jest transakcyjna. Spróbuj dodać @Transactional do swojej metody lub klasy.

+1

To tylko wybrane zapytanie. Czy muszę dodać tę adnotację do wszystkich metod DAO? – chedine

+0

Może to być metoda DAO, metoda serwisowa lub jedna z klas, ale musi być gdzieś w stosie, jeśli korzystasz z TransactionManager lub otrzymasz wyjątek napotkany, ponieważ próbujesz uruchomić zapytanie poza transakcją. – rjsang

+0

Dlaczego niektórzy pracują bez tej adnotacji? – chedine

4

mam ten problem poprzez określenie current_session_context_class w hibernate config być „thread”, jak na prostej konfiguracji przedstawionej na hibernate configuration documentation.

Zaleca jednak, aby nie było to bezpieczne w przypadku użycia produkcyjnego.

Próbując dodać następujące w hibernate config powinny również pomóc:

<property name="current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property> 

Odjazd http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/architecture.html#architecture-current-session więcej szczegółów.

+1

Po prostu ostrzeżenie dla tych, którzy próbują tego i używają Springa: Właśnie dostałem inny błąd podczas konfigurowania "current_session_context_class". W kilku innych kwestiach ustąpiły problemy z transakcjami. Skutecznie wydaje się, że usuwa to zarządzanie transakcjami wiosennymi. (patrz na przykład: http://stackoverflow.com/questions/4293098/how-tointegrate-spring-with-hibernate-session-and-transaction-management) – Yashima

+0

Miałem również inne zachowanie. Załadowałem obiekt z bazy danych, wprowadziłem zmianę, a następnie próbowałem ją zatrzymać. Aby to zadziałało, musiałem go wyeksmitować z sesji, a następnie zapisać. – Zoidberg

Powiązane problemy