Reputation: 279960
There are terribly many questions about this on SO, but I've tried some of them that sound correct, but I'm still getting
org.hibernate.HibernateException: No Session found for current thread
My Service layer classes are annotated as such:
@Service
public class MyService {
@Autowired
public SomeDao someDao;
@Transactional
public void performSomeTransaction() {/* ... */}
}
My application context XML has the following relevant declarations:
<context:component-scan base-package = "com.myapp.business.dao.impl" />
<context:component-scan base-package = "com.myapp.business.services" />
<context:annotation-config />
<tx:annotation-driven transaction-manager = "transactionManager" />
<!-- Hibernate -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="hibernateProperties">
<props>
<prop key="connection.url">jdbc:mysql://localhost:3306/bidapp</prop>
<prop key="connection.username">bidapp</prop>
<prop key="connection.password">pennyfss</prop>
<prop key="connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.pool_size">10</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="c3p0.acquireIncrement">1</prop>
<prop key="c3p0.max_size">50</prop>
<prop key="c3p0.max_statement">0</prop>
<prop key="c3p0.min_size">10</prop>
<prop key="c3p0.timeout">0</prop>
</props>
</property>
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan">
<list>
<value>com.bidapp.business.domain</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/bidapp" />
<property name="username" value="bidapp" />
<property name="password" value="pennyfss" />
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
I also have my dispatcher-servlet.xml
file with
<mvc:annotation-driven />
<mvc:default-servlet-handler />
<context:component-scan base-package="com.myapp.presentation.controllers" />
<context:annotation-config />
<bean id="viewResolver" class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
<property name="templateEngine" ref="templateEngine" />
</bean>
Why doesn't spring wrap my services with transactions?
So it appears that the issue has to do with not getting instances correctly. I have the following Shiro Security config:
<bean id = "hibernateRealm" class = "com.bidapp.presentation.shiro.HibernateRealm" >
<property name = "credentialsMatcher" ref = "credentialsMatcher" />
</bean>
<bean id = "credentialsMatcher" class = "com.bidapp.presentation.shiro.JasyptCredentialsMatcher" />
<bean id = "securityManager" class = "org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name = "realm" ref = "hibernateRealm" />
</bean>
HibernateRealm is the service class with the @Transactional
annotation. Shouldn't Spring be wrapping it in a proxy since it is creating it here.
Upvotes: 3
Views: 3010
Reputation: 31
Add the property hibernate.current_session_context_class=thread during session factory creation in hibernate-persistance.xml file it will work.
Upvotes: 0
Reputation: 128829
The most common causes of this problem are
Spring XML file configuration hierarchy help/explanation
Declaring Spring Bean in Parent Context vs Child Context
Showing the code where you obtain and use the service instance will help define the problem.
Upvotes: 1