Spring 数据 - H2 内存数据库、延迟加载及其工作原理

Spring Data - H2 in-memory database, lazy-loading and how it works

H2 数据库可以完全在内存模式下工作 - 数据存储在 RAM 中而不是磁盘空间中,没有 I/O 操作,更好的性能等(据我所知)。 让我们考虑下一个简单的实体。

@Entity
@Table(name = "USER")
public class User {

    @Id
    @GeneratedValue
    @Column(name = "USER_ID")
    private Long userId;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    private Set<OrderDetail> orderDetail = new HashSet();
} 

使用标准的 JpaRepository 我们可以将其保存在内存中并执行其他 CRUD 操作。但是,为了检索已保存的实体并依赖于其他实体(用户的 orderDetail),我们仍然必须使用获取图、JPQL 连接语句急切地加载它,在事务中访问它或直接指向集合获取类型。当我们面临多个依赖项时,情况会变得更糟,这会导致 n+1 或笛卡尔积在使用实体图进行急切获取时。

据我了解,既然实体存储在内存中,为什么它不允许在一次调用中加载具有所有嵌套关系的整个实体图?这东西不就是存储相关实体的引用吗?

why it doesn't allow to load entire entity graph with all nested relations in one call?

因为 JPA 使用 JDBC 与任何数据库通信,并且不关心数据库是将数据存储在内存、磁盘、闪存驱动器还是石板上。 此外,仅仅因为内存数据库不将其数据存储在某些持久存储中并不意味着访问其中的数据是免费的。您仍然需要根据存储的数据构造对象。

当然,你也可以直接将你的对象存储在内存中,例如使用HashMap或类似的数据结构,不需要任何转换,基本上只是作为参考。