Spring/Hibernate:双向映射,不同步JPQL查询

ssc*_*ep3 11 java entity hibernate jpql spring-data

在实体之间的双向映射(例如@ManyToOne@OneToMany)中,对方需要在每次更改时进行同步,尤其是在使用第二级缓存时.这通常使用辅助方法完成.如果Many部件包含大量条目,那么这些辅助方法不能很好地执行,因为每次都会获取整个集合.一个简单的例子是一个实体Store,它有n Products,但n非常大.添加新ProductStore将需要Store获取整个列表Products,终于将其添加到组(见下面的代码示例).

有人可能会争辩说,在对这种关系进行建模时,可以更好地用从单向关联Product来表示Store.我们在应用程序中使用了很多JPQL查询.在JPQL中,从双方加入实体非常方便.

@OneToManyStore实体中映射关系时是否看到任何问题,Many实际上意味着很多而不仅仅是少数几个,只要让整个关系被懒惰地取出,只是让字段保密,没有getter和setter?据我所知,Hibernate只需要字段来映射关系.如果该集是私有的,那么不会出现性能问题?


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
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

Dra*_*vic 6

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

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