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