Je reçois l'exception ci-dessus avec Spring3 et Hibernte4
Ce qui suit est mon fichier XML bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<context:annotation-config/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/GHS"/>
<property name="username" value="root"/>
<property name="password" value="newpwd"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.example.ghs.model.timetable</value>
</list>
</property>
</bean>
<bean id="baseDAO"
class="com.example.ghs.dao.BaseDAOImpl"/>
</beans>
Ma classe BaseDAO ressemble à ceci
public class BaseDAOImpl implements BaseDAO{
private SessionFactory sessionFactory;
@Autowired
public BaseDAOImpl(SessionFactory sessionFactory){
this.sessionFactory = sessionFactory;
}
@Override
public Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
}
Le code suivant lève l'exception dans le titre
public class Main {
public static void main(String[] args){
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("dao-beans.xml");
BaseDAO bd = (BaseDAO) context.getBean("baseDAO");
bd.getCurrentSession();
}
}
Quelqu'un at-il une idée de la façon de résoudre ce problème?
getCurrentSession()
n'a de sens que dans une portée de transaction.
Vous devez déclarer un gestionnaire de transactions approprié, délimiter les limites des transactions et effectuer un accès aux données à l'intérieur. Par exemple, comme suit:
<bean id = "transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name = "sessionFactory" ref = "sessionFactory" />
</bean>
.
PlatformTransactionManager ptm = context.getBean(PlatformTransactionManager.class);
TransactionTemplate tx = new TransactionTemplate(ptm);
tx.execute(new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult(TransactionStatus status) {
// Perform data access here
}
});
Voir aussi:
Je suis tombé sur le même problème et j'ai résolu comme ci-dessous Ajout de @Transactional sur la classe daoImpl
Gestionnaire de trnsaction ajouté dans le fichier de configuration:
<tx:annotation-driven/>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
Je vais juste ajouter quelque chose qui m'a mis du temps à déboguer: n'oubliez pas qu'une annotation @Transactional ne fonctionnera que sur les méthodes "publiques".
J'ai mis des @Transactional sur ceux "protégés" et j'ai eu cette erreur.
J'espère que ça aide :)
http://docs.spring.io/spring/docs/3.1.0.M2/spring-framework-reference/html/transaction.html
Visibilité de la méthode et @Transactional
Lorsque vous utilisez des proxys, vous devez appliquer l'annotation @Transactional uniquement aux méthodes ayant une visibilité publique. Si vous annotez des méthodes protégées, privées ou visibles par package avec l'annotation @Transactional, aucune erreur n'est déclenchée, mais la méthode annotée ne présente pas les paramètres transactionnels configurés. Envisagez l'utilisation d'AspectJ (voir ci-dessous) si vous devez annoter des méthodes non publiques.