2

我有一个执行简单选择查询的 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. 成功获得结果的“select * from MyTable where some_id = ...”查询
  2. 之后我在我的日志中找到了这个:

    org.springframework.orm.jpa.JpaTransactionManager:启动事务提交 org.springframework.orm.jpa.JpaTransactionManager:在EntityManager [org.hibernate.ejb.EntityManagerImpl@162add4]上提交JPA事务 org.hibernate.transaction.JDBCTransaction:提交org. hibernate.event.def.AbstractFlushingEventListener:处理刷新时间级联 org.hibernate.event.def.AbstractFlushingEventListener:刷新:0 次插入,1 次更新,0 次删除到 2 个对象

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

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

4

1 回答 1

2

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

于 2012-12-04T14:18:55.013 回答