[英]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.