java 事务性,[QueryDSL / Spring] java.lang.IllegalStateException:Connection不是事务性的

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值