Ich bekomme die obige Ausnahme mit Spring3 und Hibernte4
Das Folgende ist meine Bean-XML-Datei
<?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>
Meine BaseDAO-Klasse sieht so aus
public class BaseDAOImpl implements BaseDAO{
private SessionFactory sessionFactory;
@Autowired
public BaseDAOImpl(SessionFactory sessionFactory){
this.sessionFactory = sessionFactory;
}
@Override
public Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
}
Der folgende Code löst die Ausnahme im Titel aus
public class Main {
public static void main(String[] args){
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("dao-beans.xml");
BaseDAO bd = (BaseDAO) context.getBean("baseDAO");
bd.getCurrentSession();
}
}
Hat jemand eine Idee, wie man dieses Problem löst?
getCurrentSession()
macht nur innerhalb eines Transaktionsbereichs Sinn.
Sie müssen einen geeigneten Transaktionsmanager deklarieren, Transaktionsgrenzen abgrenzen und den Datenzugriff darin ausführen. Zum Beispiel wie folgt:
<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
}
});
Siehe auch:
Ich bin auf dasselbe Problem gestoßen und wurde wie unten beschrieben gelöst. @Transactional in der daoImpl-Klasse hinzugefügt
Trnsaction manager in Konfigurationsdatei hinzugefügt:
<tx:annotation-driven/>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
Ich füge nur etwas hinzu, dessen Debugging einige Zeit in Anspruch nahm: Vergessen Sie nicht, dass eine @ Transactional-Annotation nur bei "öffentlichen" Methoden funktioniert.
Ich habe einige @Transactional auf "geschützte" gesetzt und diesen Fehler bekommen.
Ich hoffe es hilft :)
http://docs.spring.io/spring/docs/3.1.0.M2/spring-framework-reference/html/transaction.html
Methodensichtbarkeit und @Transactional
Wenn Sie Proxys verwenden, sollten Sie die Annotation @Transactional nur auf Methoden mit öffentlicher Sichtbarkeit anwenden. Wenn Sie geschützte, private oder für Pakete sichtbare Methoden mit der @ Transactional-Annotation mit Anmerkungen versehen, wird kein Fehler ausgegeben, die mit Anmerkungen versehene Methode weist jedoch nicht die konfigurierten Transaktionseinstellungen auf. Ziehen Sie die Verwendung von AspectJ in Betracht (siehe unten), wenn Sie nicht öffentliche Methoden mit Anmerkungen versehen müssen.