De volledige foutmelding pastte niet in de titel en luidt:
Dat gaat zo:
applicationContext.xml van de hoofdapplicatie:
De applicationContext-app.xml definieert de jotm jta transactionmanager:
App 1 t/m 3 stellen de drie applicaties voor die ik samen wil voegen. Het relevante deel uit 1 van de applicationContexts:
App2 en App3 zijn vergelijkbaar opgezet.
Wanneer ik de applicatie met Tomcat opstart gaat alles goed, jta wordt geladen en session factories worden gemaakt. Wanneer ik nu via een service in een van mijn apps probeer een hibernate sessie op te halen via:
waar ik heb gedefinieerd dat:
Dan krijg ik dus bovenstaande melding:
Spring gurus hier?
Mijn situatie is redelijk 'complex', ik probeer drie application contexts van drie applicaties samen te voegen en transactiemanagement toe te passen over de database verbindingen van alle drie de applicaties. In theorie kunnen de applicaties drie verschillende databases aanspreken.No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
Dat gaat zo:
applicationContext.xml van de hoofdapplicatie:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"> <bean id="app.context" class="org.springframework.context.support.ClassPathXmlApplicationContext"> <constructor-arg> <list> <value>applicationContext-app.xml</value> <value>applicationContext-app1.xml</value> <value>applicationContext-app2.xml</value> <value>applicationContext-app3.xml</value> </list> </constructor-arg> </bean> </beans> |
De applicationContext-app.xml definieert de jotm jta transactionmanager:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction"> <ref local="jotm"/> </property> </bean> <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributeSource"> <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/> </property> </bean> <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> <property name="transactionInterceptor" ref="transactionInterceptor"/> </bean> </beans> |
App 1 t/m 3 stellen de drie applicaties voor die ik samen wil voegen. Het relevante deel uit 1 van de applicationContexts:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| <?xml version="1.0" encoding="utf-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"> <bean id="app1InnerDataSource" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName"><jee:jndi-lookup jndi-name="java:comp/env/app1/jdbc/driver"/></property> <property name="url"><jee:jndi-lookup jndi-name="java:comp/env/app1/jdbc/url"/></property> <property name="maxCon"><jee:jndi-lookup jndi-name="java:comp/env/app1/jdbc/maxCon"/></property> <property name="minCon"><jee:jndi-lookup jndi-name="java:comp/env/app1/jdbc/minCon"/></property> </bean> <bean id="app1DataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource" ref="app1InnerDataSource"/> <property name="user"><jee:jndi-lookup jndi-name="java:comp/env/app1/jdbc/username"/></property> <property name="password"><jee:jndi-lookup jndi-name="java:comp/env/app1/jdbc/password"/></property> <property name="maxSize"><jee:jndi-lookup jndi-name="java:comp/env/app1/jdbc/maxPoolSize"/></property> <property name="minSize"><jee:jndi-lookup jndi-name="java:comp/env/app1/jdbc/minPoolSize"/></property> </bean> <bean id="app1HibernateSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="configLocation"> <value>classpath:hibernate.app1.cfg.xml</value> </property> <property name="schemaUpdate"> <value>false</value> </property> <property name="dataSource" ref="app1DataSource"/> </bean> <bean id="app1HibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory"><ref bean="app1HibernateSessionFactory"/></property> <property name="jdbcExceptionTranslator"><ref bean="app1JdbcExceptionTranslator"/></property> </bean> <bean id="app1JdbcExceptionTranslator" class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator"> <property name="dataSource"><ref bean="app1DataSource"/></property> </bean> <bean id="app1JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"><ref bean="app1DataSource"/></property> <property name="exceptionTranslator"><ref bean="app1JdbcExceptionTranslator"/></property> </bean> </beans> |
App2 en App3 zijn vergelijkbaar opgezet.
Wanneer ik de applicatie met Tomcat opstart gaat alles goed, jta wordt geladen en session factories worden gemaakt. Wanneer ik nu via een service in een van mijn apps probeer een hibernate sessie op te halen via:
Java:
1
| Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); |
waar ik heb gedefinieerd dat:
Java:
1
| @Transactional(propagation = Propagation.REQUIRED, readOnly = true) |
Dan krijg ik dus bovenstaande melding:
Moet ik ergens in mijn configuratie expliciet maken dat bepaalde threads bij een bepaalde session factory horen? Moet ik iets bouwen dat bijv. via een threadlocal de juiste factory oplevert? Ik heb aardig wat afgezocht, maar kan niet vinden wat nu exact mijn probleem hier is en nog belangrijker, de oplossingNo Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
Spring gurus hier?