首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在JPA中通过id找到对象,而不是通过JPQL查询?

为什么在JPA中通过id找到对象,而不是通过JPQL查询?
EN

Stack Overflow用户
提问于 2010-08-06 02:57:32
回答 3查看 913关注 0票数 1

我有一个Spring4测试用例,它使用JUnit @Transactional注释保存一个对象,然后尝试查找它。当我使用这个实现时,测试用例通过了:

代码语言:javascript
运行
复制
@Override
public EventSummary findEventSummaryById(Integer id) {
    return em.find(EventSummary.class, id);
}

当我使用这个实现(然后更改我在测试用例中调用的方法)时,它会失败:

代码语言:javascript
运行
复制
@Override
public EventSummary findEventSummary(Integer id) {
    Query query = em.createQuery("select es from EventSummary as es where es.id = :id");
    query.setParameter("id", id);
    EventSummary result = (EventSummary) query.getSingleResult();
    return result;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-06 05:36:38

如果您正在使用缺省刷新模式(AUTO),并且如果您在一个事务中执行查询,那么JPA规范将保证查询不会返回陈旧或不正确的数据:

3.6.2查询和FlushMode

刷新模式设置会影响查询结果,如下所示。

在事务内执行查询时,如果在Query对象上设置了FlushModeType.AUTO,或者如果持久性上下文的刷新模式设置为AUTO (缺省值),并且尚未为Query对象指定刷新模式设置,则持久性提供器负责确保对持久性上下文中所有实体的状态的所有更新对查询处理可见,这些更新可能会影响查询的结果。持久性提供程序实现可以通过将这些实体刷新到数据库或通过一些其他方式来实现这一点。如果设置了FlushModeType.COMMIT,则对持久性上下文中的实体进行的更新对查询的影响是未指定的。

公共枚举提交{ FlushModeType,AUTO }

如果没有活动的事务,则持久性提供程序不能刷新到数据库。

假设您使用的是AUTO,请检查事务方面。

票数 3
EN

Stack Overflow用户

发布于 2010-08-06 04:44:41

Т该实体处于当前会话(实体管理器)中-它处于持久状态,等待刷新。get方法首先检查会话的内容,如果没有找到,则转到底层数据库。在您的示例中,该实体刚刚保存在同一会话中,因此会找到并返回该实体。

更新:原来问题是使用了错误的事务管理器,因此实体没有刷新到数据库中。参见Pascal的解释。

票数 3
EN

Stack Overflow用户

发布于 2010-08-06 03:04:35

在第一种情况下,id是一个整数

在第二个示例中,id是一个字符串

Integer永远不会等于字符串

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3418160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档