内存数据库中的Spring Data-H2,延迟加载及其工作方式



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();
} 

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

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

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

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

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

最新更新