关键是要有一个像你期望的那样工作的应用程序,而且不会像地狱一样慢。举个例子:
Order order = em.find(Order.class, 3L);
Customer customer = em.find(Customer.class, 5L);
for (Order o : customer.getOrders()) { // line A
if (o.getId().longValue == 3L) {
o.setComment("hello"); // line B
o.setModifier("John");
}
}
System.out.println(order.getComment)); // line C
for (Order o : customer.getOrders()) { // line D
System.out.println(o.getComment()); // line E
}
在 A 行,JPA 执行 SQL 查询以加载客户的所有订单。
在 C 行,您希望打印什么?null
还是"hello"
?您希望打印“hello”,因为您在 B 行修改的订单与第一行中加载的订单具有相同的 ID。如果没有一级缓存,这是不可能的。
在 D 行,您不希望从数据库中再次加载订单,因为它们已经在 A 行加载。如果没有一级缓存,这是不可能的。
在 E 行,您希望再次为订单 3 打印“hello”。如果没有一级缓存,这是不可能的。
在 B 行,您不希望执行更新查询,因为可能会对同一实体进行许多后续修改(如下一行)。因此,您希望这些修改尽可能晚地写入数据库,在事务结束时一次性完成。如果没有一级缓存,这是不可能的。