Spring Transaction试图在select查询后触发更新

时间:2012-12-04 12:40:47

标签: java spring hibernate transactions spring-transactions

我有一个执行简单选择查询的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();
}

当我运行它时,我在日志中找到两个查询:

  1. “选择*来自MyTable,其中some_id = ...”查询成功获得结果
  2. 之后我在日志中找到了这个:

    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个对象

  3. 然后它会触发另一个查询“Update my_table set ....”

    为什么要执行此更新查询?

1 个答案:

答案 0 :(得分:2)

正如上面提到的Pace“在JPA中,当事务提交JPA时,会将任何已修改的实体写入数据库”。所以我尝试将readOnly = true添加到@Transactional注释中,它解决了问题。