Java Spring事务正在尝试在选择查询后触发更新

Java Spring事务正在尝试在选择查询后触发更新,java,spring,hibernate,transactions,spring-transactions,Java,Spring,Hibernate,Transactions,Spring Transactions,我有一个DAO方法,它执行一个简单的select查询: @Transactional public List<Object[]> getMyTableData(Long someId) { Session session = (Session) getEntityManager().getDelegate(); return session .createSQLQuery("SELECT * FROM my_table where some_id =

我有一个DAO方法,它执行一个简单的select查询:

@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();
}
@Transactional
公共列表getMyTableData(长someId)
{
会话会话=(会话)getEntityManager().getDelegate();
返回会话
.createSQLQuery(“从my_表中选择*,其中some_id=:someId”)
.addEntity(MyTable.class)
.setParameter(“someId”,someId)
.list();
}
运行时,我在日志中发现两个查询:

  • 一个“select*from MyTable where some_id=…”查询,它成功地获得了结果
  • 之后,我在我的日志中发现:

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

  • 然后它触发另一个查询“更新我的表集…”


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

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

    大多数日志记录都表明您的事务正在结束。由于事务是围绕getMyTableData()方法进行的,因此它将在方法之前开始一个事务,并在结束时关闭它(除非调用方法也用Transactional注释,在这种情况下,它将简单地加入较大的事务)。在JPA中,当事务提交时,JPA会将任何修改的实体写入数据库。奇怪的是,在您展示的示例中,您根本没有修改查询结果。在您的实际应用程序中,您对返回的对象做了什么吗?没有,我没有更新结果集中的任何内容。但我发现,如果在事务注释中添加“readOnly=true”,它将不会更新实体。我遇到了相同的问题,即我从视图中选择一行,并且我无法通过“连接视图”错误修改多个基表,我尝试在@transactional上使用readOnly=true,但这不起作用。