Sping @Transactional brak transakcji

0

Dostaje taki błąd:

HTTP Status 500 - Request processing failed; nested exception is org.hibernate.HibernateException: createCriteria is not valid without active transaction
 

Teraz tak beany:

 
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
    	...
 </bean>

 <bean id="sessionFactory"
                    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
                    <property name="dataSource" ref="dataSource" />
                    <property name="packagesToScan" value="..." />
                    <property name="hibernateProperties">
                        <props>
                            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                            <prop key="hibernate.current_session_context_class">thread</prop>
                            <prop key="hibernate.show_sql">false</prop>
                        </props>
                    </property>
    </bean>

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

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

Metoda w service layer

@Transactional(rollbackFor = {Exception.class},propagation = Propagation.REQUIRES_NEW)
    public List<PermissionDTO> findAll(){
        List<Permission> entities = permissionRepository.findAll();
        List<PermissionDTO> result = new ArrayList<>(entities.size());
        entities.forEach(i->result.add(new PermissionDTO(i.getId(),i.getPermission())));
        return result;
    }

Czy jest ew. też możliwie że błąd jest spowodowany przez użycie:

    <mvc:annotation-driven />
 
0

A możesz pokazać skąd wołasz metodę findAll() ? Może nie jest wywoływana przez proxy tylko z tego samego serwisu?

0

Pokaż jak masz zdefiniowany ten serwis w którym masz tą metodę. W szczególności problem może występować jeśli wstrzykujesz klasę a nie interfejs.

0

Metoda findAll jest wywoływana przez warste dao:

 
 @Autowired
   PermissionRepository permissionRepository;

<bean id="permissionRepository" class="....PermissionRepositoryImpl"></bean>

PermissionRepository to interface, tak samo jak PermissionService

Edit:
znalazłem rozwiązanie problemu:

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

Usunięte i działa :)

0

A jesteś pewien że masz w <context:component-scan base-package="cośtam"/> dobry pakiet? W sensie że spring widzi te wszystkie obiekty?
A ten permission service też na pewno wstrzykujesz przez interfejs?
Łatwiej by było jakbyś miał to w jakims repo na githubie bo tak to mozemy pytać jeszcze 100 lat.

1 użytkowników online, w tym zalogowanych: 0, gości: 1