[QueryDSL/Spring]java。lang.IllegalStateException:连接不是事务性的
我正在编写Spring+Vaadin应用程序。我想将QueryDSL添加到access db(Oracle)中。我查阅了文档(http://docs.spring.io/spring-data/jdbc/docs/current/reference/html/core.querydsl.html),了解到Spring建议使用标准QueryDSLAPI。我在以下情况下加入了我的项目:
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-sql-spring</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-sql</artifactId>
<version>${querydsl.version}</version>
</dependency>
我的豆子。xml如下所示:
<bean id="dataSourceOracle" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.oracle.driverClassName}" />
<property name="url" value="${db.oracle.url}"/>
<property name="username" value="${db.oracle.username}" />
<property name="password" value="${db.oracle.password}" />
<property name="defaultAutoCommit" value="false" />
</bean>
在我的DatabaseFacade
实现中,我执行以下配置:
private SQLQueryFactory query;
@Autowired
@Qualifier("DataSource")
public void setDataSource(DataSource dataSource) {
Provider<Connection> provider = new SpringConnectionProvider(dataSource);
Configuration configuration = new Configuration(new OracleTemplates());
configuration.setExceptionTranslator(new SpringExceptionTranslator());
query = new SQLQueryFactory(configuration, provider);
}
不幸的是,每次启动应用程序时,我都会得到:
10:29:54.490 [main] DEBUG o.s.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
10:29:56.231 [main] ERROR c.r.i.k.b.impl.DatabaseFacadeImpl - Error happend in com.roche.icc.kps.backend.impl.DatabaseFacadeImpl.getEditableKPSStores
10:29:56.234 [main] ERROR c.r.i.k.b.impl.DatabaseFacadeImpl - Connection is not transactional
java.lang.IllegalStateException: Connection is not transactional
at com.mysema.query.sql.spring.SpringConnectionProvider.get(SpringConnectionProvider.java:45) ~[querydsl-sql-spring-3.7.0.jar:na]
at com.mysema.query.sql.spring.SpringConnectionProvider.get(SpringConnectionProvider.java:33) ~[querydsl-sql-spring-3.7.0.jar:na]
at com.mysema.query.sql.SQLQueryFactory.query(SQLQueryFactory.java:63) ~[querydsl-sql-3.7.0.jar:na]
at com.mysema.query.sql.SQLQueryFactory.query(SQLQueryFactory.java:28) ~[querydsl-sql-3.7.0.jar:na]
at com.mysema.query.sql.AbstractSQLQueryFactory.from(AbstractSQLQueryFactory.java:54) ~[querydsl-sql-3.7.0.jar:na]
有人遇到过这个问题吗?我应该使用不同的DataSource
(Atomikos?)吗
谢谢你的帮助
卡米尔
# 1 楼答案
我遇到了此问题,并能够解决此问题,如下所示:
除了应该为dao/Repository类标记
@Transactional
注释外,还必须为spring java配置类标记@EnableTransactionManagement
,如下所示spring integration section
您还可以在spring上下文xml中声明
EnableTransactionManagement
:<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
# 2 楼答案
我遇到了同样的问题
问题是QueryDSL希望数据源连接位于事务中。因此,要么您必须显式地开始事务并处理它,要么IOC容器应该为您完成
在这种情况下,您很可能在任何应用程序层(服务/存储库)中都没有@Transactional注释,而这些应用程序层本应启动事务
将@Transactional注释添加到dao或服务层以解决此问题
帮助我的链接是 https://groups.google.com/forum/#!topic/querydsl/_PqMek79TZE
一个范例项目https://github.com/querydsl/querydsl/tree/master/querydsl-examples/querydsl-example-sql-spring
更新
这就是示例项目中DaoImpl的实现方式
请注意类级别中的@Transactional注释
在您的情况下,注释应该放在DatabaseFacade实现中。我假设您的Spring应用程序也配置了事务管理器