我有一个Spring4测试用例,它使用JUnit @Transactional
注释保存一个对象,然后尝试查找它。当我使用这个实现时,测试用例通过了:
@Override
public EventSummary findEventSummaryById(Integer id) {
return em.find(EventSummary.class, id);
}
当我使用这个实现(然后更改我在测试用例中调用的方法)时,它会失败:
@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;
}
发布于 2010-08-05 21:36:38
如果您正在使用缺省刷新模式(AUTO
),并且如果您在一个事务中执行查询,那么JPA规范将保证查询不会返回陈旧或不正确的数据:
3.6.2查询和FlushMode
刷新模式设置会影响查询结果,如下所示。
在事务内执行查询时,如果在Query
对象上设置了FlushModeType.AUTO
,或者如果持久性上下文的刷新模式设置为AUTO
(缺省值),并且尚未为Query
对象指定刷新模式设置,则持久性提供器负责确保对持久性上下文中所有实体的状态的所有更新对查询处理可见,这些更新可能会影响查询的结果。持久性提供程序实现可以通过将这些实体刷新到数据库或通过一些其他方式来实现这一点。如果设置了FlushModeType.COMMIT
,则对持久性上下文中的实体进行的更新对查询的影响是未指定的。
公共枚举提交{ FlushModeType,AUTO }
如果没有活动的事务,则持久性提供程序不能刷新到数据库。
假设您使用的是AUTO
,请检查事务方面。
发布于 2010-08-05 20:44:41
Т该实体处于当前会话(实体管理器)中-它处于持久状态,等待刷新。get方法首先检查会话的内容,如果没有找到,则转到底层数据库。在您的示例中,该实体刚刚保存在同一会话中,因此会找到并返回该实体。
更新:原来问题是使用了错误的事务管理器,因此实体没有刷新到数据库中。参见Pascal的解释。
发布于 2010-08-05 19:04:35
在第一种情况下,id是一个整数
在第二个示例中,id是一个字符串
Integer永远不会等于字符串
https://stackoverflow.com/questions/3418160
复制相似问题