gpt4 book ai didi

java - Spring /hibernate : Bidirectional Mapping without synchronization for JPQL queries only

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:19 24 4
gpt4 key购买 nike

在实体之间的双向映射中(例如 @ManyToOne@OneToMany),对应方需要是 synchronized on every change ,尤其是在使用 2nd 级缓存时。这通常是通过辅助方法完成的。如果 Many 部分包含大量条目,那么这些辅助方法将无法正常执行,因为每次都会获取整个集合。一个简单的例子是实体 Store,它有 n Products,而 n 非常大。将新的 Product 添加到 Store 需要 Store 获取整个 Products 列表以最终添加它到集合(参见下面的代码示例)。

有人可能会争辩说,在对这种关系建模时,最好用从 ProductStore 的单向关联来表示。不过,我们在我们的应用程序中使用了许多 JPQL 查询。在 JPQL 中,连接两侧的实体非常方便。

Store 实体中映射 @OneToMany 关系时,您是否看到任何问题,而 Many 实际上意味着很多,而不仅仅是一些, 并且只是将字段设为私有(private),没有 getter 和 setter,前提是整个关系都是延迟获取的?据我了解,Hibernate 只需要字段来映射关系。如果集合是私有(private)的,应该不会出现性能问题?


Product 实体:

@Entity
@Table(name = "product")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Product {

@ManyToOne(fetch = FetchType.LAZY)
private Store store;

// setter, getter, helper methods
}

Store 实体:

@Entity
@Table(name = "store")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Store {

@OneToMany(mappedBy = "products", fetch = FetchType.LAZY)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Product> products;

// setter, getter, helper methods
}

最佳答案

不,这没有任何问题,这也是我经常使用的一种技术。当然,只需确保在某些上下文中不会反射访问该字段(例如自动 toString 构建器和您可能正在使用的类似实用程序)。

此外,您不需要在其上使用 @Cache 注释,因为您永远不会访问该集合,因此它永远不会被缓存。

关于java - Spring /hibernate : Bidirectional Mapping without synchronization for JPQL queries only,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49944788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com