com.mysema.querydsl
querydsl-sql-spring
${querydsl.version}
org.springframework
spring-jdbc
${spring.version}
org.apache.commons
commons-dbcp2
2.1.1
com.mysema.querydsl
querydsl-sql
${querydsl.version}
我的beans.xml如下:
在我的DatabaseFacade实现中,我做了以下配置:
private SQLQueryFactory query;
@Autowired
@Qualifier("DataSource")
public void setDataSource(DataSource dataSource) {
Provider 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?)?
感谢帮助!
卡米尔
解决方法:
我遇到了同样的问题.
问题是QueryDSL期望数据源连接在事务中.因此要么你必须明确地开始交易并处理它,要么IOC容器应该为你做.
在这种情况下,您很可能在应该启动事务的任何应用程序层(服务/存储库)中没有@Transactional注释.
将@Transactional注释添加到dao或服务层以解决问题.
更新
这是DaoImpl如何从示例项目中获得的.
请注意类级别中的@Transactional注释.
@Transactional
public class CustomerDaoImpl implements CustomerDao {
@Inject
SQLQueryFactory queryFactory;
final QBean customerAddressBean = bean(CustomerAddress.class,
customerAddress.addressTypeCode, customerAddress.fromDate, customerAddress.toDate,
bean(Address.class, address.all()).as("address"));
final QBean customerBean = bean(Customer.class,
customer.id, customer.name,
bean(Person.class, person.all()).as("contactPerson"),
GroupBy.set(customerAddressBean).as("addresses"));
@Override
public Customer findById(long id) {
List customers = findAll(customer.id.eq(id));
return customers.isEmpty() ? null : customers.get(0);
}
@Override
public List findAll(Predicate... where) {
return queryFactory.from(customer)
.leftJoin(customer.contactPersonFk, person)
.leftJoin(customer._customer3Fk, customerAddress)
.leftJoin(customerAddress.addressFk, address)
.where(where)
.transform(GroupBy.groupBy(customer.id).list(customerBean));
}
@Override
public Customer save(Customer c) {
Long id = c.getId();
if (id == null) {
id = queryFactory.insert(customer)
.set(customer.name, c.getName())
.set(customer.contactPersonId, c.getContactPerson().getId())
.executeWithKey(customer.id);
c.setId(id);
} else {
queryFactory.update(customer)
.set(customer.name, c.getName())
.set(customer.contactPersonId, c.getContactPerson().getId())
.where(customer.id.eq(c.getId()))
.execute();
// delete address rows
queryFactory.delete(customerAddress)
.where(customerAddress.customerId.eq(id))
.execute();
}
SQLInsertClause insert = queryFactory.insert(customerAddress);
for (CustomerAddress ca : c.getAddresses()) {
if (ca.getAddress().getId() == null) {
ca.getAddress().setId(queryFactory.insert(address)
.populate(ca.getAddress())
.executeWithKey(address.id));
}
insert.set(customerAddress.customerId, id)
.set(customerAddress.addressId, ca.getAddress().getId())
.set(customerAddress.addressTypeCode, ca.getAddressTypeCode())
.set(customerAddress.fromDate, ca.getFromDate())
.set(customerAddress.toDate, ca.getToDate())
.addBatch();
}
insert.execute();
c.setId(id);
return c;
}
@Override
public long count() {
return queryFactory.from(customer).fetchCount();
}
@Override
public void delete(Customer c) {
// TODO use combined delete clause
queryFactory.delete(customerAddress)
.where(customerAddress.customerId.eq(c.getId()))
.execute();
queryFactory.delete(customer)
.where(customer.id.eq(c.getId()))
.execute();
}
}
在您的情况下,注释应放在DatabaseFacade实现中.我假设您的Spring应用程序也配置了事务管理器.
标签:java,spring,querydsl,transactional
来源: https://codeday.me/bug/20190623/1271165.html