问题场景:
项目场景:项目使用JPA,业务需要查询某条数据,根据数据内容返回信息判断是否更新表数据。
报错信息:Connection is read-only. Queries leading to data modification are not allowed
原因分析:
查询数据时调用了JPA实现的查询接口,本身使用的实现层未重写该接口,该接口创建只读连接。
知识总结:
Spring Data 提供了默认的事务处理方式,即所有的查询均声明为只读事务。确保了单个请求过程数据的一致性。
对于自定义的方法,如需改变 SpringData 提供的事务默认方式,可以在方法上注解@Transactional声明进行多个Repository操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,需要在Service层实现对多个 Repository的调用,并在相应的方法上声明事务。
Repository概念:按照最初提出者的介绍,它是衔接数据映射层和域之间的一个纽带,作用相当于一个在内存中的域对象集合。客户端对象把查询的一些实体进行组合,并把它们提交给Repository。对象能够从Repository中移除或者添加,就好比这些对象在一个Collection对象上就行数据操作,同时映射层的代码会对应的从数据库中取出相应的数据。
从概念上讲,Repository是把一个数据存储区的数据给封装成对象的集合并提供了对这些集合的操作。广义上可以理解为我们常说的DAO。
解决方案:
不使用jpa自有的查询接口,使用自己创建的查询接口。
问题解决,查询完成后,再去update表数据成功。
可根据需求增加 @Transactional注解,该注解提供了事务,具体用法自行百度。