[hibernate + spring] No Hibernate Session bound to thread

0

Czesc, mam taki problem. Klasa TestDAOImpl wyglada tak:

 
public class TestDAOImpl extends HibernateDaoSupport implements TestDAO {

 public void deleteAllTest(){
               SQLQuery q = getHibernateTemplate().getSessionFactory().getCurrentSession()
                      .createSQLQuery("" + "TRUNCATE table Test");
}

}

Ale wywala mi to:
No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

Czemu??

moj applicationContext:

 
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 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-2.5.xsd">


	<bean id="applicationContextProvider" class="com.test.ApplicationContextProvider" />
	<bean id="hibernateDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/test_db" />
		<property name="username" value="user" />
		<property name="password" value="pass" />
	</bean>
<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

		<property name="dataSource" ref="hibernateDataSource" />
		<property name="schemaUpdate" value="true" />
		<property name="hibernateProperties">
			<value>
				hibernate.dialect = org.hibernate.dialect.MySQLDialect
				show_sql = true
				current_session_context_class = thread
       </value>
		</property>
		<property name="annotatedClasses">
			<list>
				<value>com.entity.Test</value>
			</list>
		</property>
	</bean>

	<bean id="testDAOImpl" class="com.dao.TestDAOImpl" lazy-init="true">
		<property name="sessionFactory" ref="hibernateSessionFactory" />
	</bean>

</beans>
	

Lub moze ktos z Was wie jak inaczej przy pomocy getHibernateTemplate() zrobic truncate na tabeli?

(truncate table Test)

pzdr,
misty

0

jak z kolei uzyje HibernataCallback, ktory w metodize doInHibernate korzysta z obiektu sesji to mi smiga..:

         getHibernateTemplate().execute(new HibernateCallback<Object>() {

            public Object doInHibernate(Session session) throws HibernateException, SQLException {

                Query q = session.createSQLQuery("truncate table test");
                int up = q.executeUpdate();
                return new Integer(up);
            }
        });

o co chodzi w tym 1szym przypadku? nie jestem pewna czy doInHibernate powinnam wykorzystywac to akcji typu delete.truncate.. to chyba bardziej do wyciagania rekordow jest?

pzdr,
misty

1

W pierwszym fragmencie uzywasz getCurrentSession(), a hibernate nie wiem skad ma wziac currentSession. HB ma wiele strategii jak tego dokonac, np. threadlocal, aktualna transakcja, itp. itd. (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/architecture.html#architecture-current-session)
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html - CTRF i szukaj 'table 3.7', tam masz opisane jak zdefiniowac current session.

0

Aha, druga proba dziala bo tam cuda robi spring, i on sam umie otwierac i zamykac sesje, nie musisz tego konfigurowac. To jest zawsze lepsze rozwiazanie...

0

no wlasnie tak doczytalam ze w tym 2gim rozwiazaniu to Spring mi o wszystko dba i pomyslalam ze moze jednak lepiej tego uzyc. Tyle ze nie podoba mi sie to, ze metoda ta zwracac cos musi, a ja robie truncate i nic zwracac nie chce.. ale to sie w sumie czepiam..

dzieki za linki!
pzdr

1

Jak metoda nic nie zaraca to jest taki standardowy pattern:
new HibernateCallback<Void> {
....

Jako ze obiektow typu Void nie mozna utworzyc za pomoca new, robisz po prostu na koncu:
return null;

Skoro wiesz ze to nic nie robi, to nie bedziesz rezultatu uzywala, a i IDE podpowie o bledzie gdy sprobujesz.

0

oo, dzieki! nie znalam tego.

pzdr,
misty

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