【发布时间】:2020-03-10 19:36:14
【问题描述】:
我的测试中有一个非常愚蠢的问题。我正在使用@DataJpaTest 在一个简单的存储库上运行一些简单的测试。我有一个名为 Event 的实体和一个应该始终返回最后一个条目的存储库接口。
但是,无论我做什么,我都会得到第一个条目。
@Entity
@Cacheable(false)
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(optional = false)
private Observed observed;
private LocalDateTime creationDate;
//Constructor that sets the observer and timestamp
//getters and setters
}
我通过 JPA 查询:
public interface EventRepository extends JpaRepository<Event, Long> {
Event findFirstById_OrderByCreationDate_Desc(@Nonnull Long id);
}
现在我希望这段代码能够执行以下操作。按事件的创建日期对事件进行排序,其中包含精确到毫秒的时间戳,将最后一个放在顶部,然后仅返回最后一个作为事件的结果。这似乎在实际应用程序中起作用。但在测试中,会发生以下情况。
@Test
public void createAndFindLastEvent() {
Event event1 = new Event(observer);
eventRepository.save(event1);
Event event2 = new Event(observer);
eventRepository.save(event2);
Event event3 = eventRepository.findFirstById_OrderByCreationDate_Desc(observer.getId());
}
结果是event3 包含event1 的值,即使event2 具有较晚的时间戳。这让我很生气。我尝试在保存时使用saveAndFlush(),直接在存储库上使用flush(),并将@Cacheable(false) 放在实体类本身上,以确保不会发生奇怪的事情。我错过了什么吗?这不应该像我期望的那样工作吗?
最奇怪的部分是findAll() 确实返回了两个事件,而排序 ASC 或 DESC 似乎没有任何改变。
【问题讨论】:
标签: spring spring-boot spring-data-jpa spring-data