我有一个执行简单选择查询的DAO方法:
@Transactional
public List<Object[]> getMyTableData(Long someId)
{
Session session = (Session) getEntityManager().getDelegate();
return session
.createSQLQuery("SELECT * FROM my_table where some_id = :someId")
.addEntity(MyTable.class)
.setParameter("someId", someId)
.list();
}
当我运行它时,我在日志中找到两个查询:
之后我在日志中找到了这个:
org.springframework.orm.jpa.JpaTransactionManager:启动事务提交 org.springframework.orm.jpa.JpaTransactionManager:在EntityManager上提交JPA事务[org.hibernate.ejb.EntityManagerImpl@162add4] org.hibernate.transaction.JDBCTransaction:commit org.hibernate.event.def.AbstractFlushingEventListener:处理刷新时间级联 org.hibernate.event.def.AbstractFlushingEventListener:Flushed:0个插入,1个更新,0个删除到2个对象
然后它会触发另一个查询“Update my_table set ....”
为什么要执行此更新查询?
答案 0 :(得分:2)
正如上面提到的Pace“在JPA中,当事务提交JPA时,会将任何已修改的实体写入数据库”。所以我尝试将readOnly = true
添加到@Transactional
注释中,它解决了问题。