繁体   English   中英

Spring Data - 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),我们仍然需要使用 fetch graph、JPQL join 语句、在事务中访问它或直接指向集合获取类型来急切地加载它。 当我们面临多个依赖关系时,情况会变得更糟,这会导致使用实体图进行急切获取时的 n+1 或笛卡尔积。

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

为什么它不允许在一次调用中加载具有所有嵌套关系的整个实体图?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM