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

时间:2018-04-20 15:12:53

标签: java hibernate spring-data entity jpql

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

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

@OneToMany实体中映射Store关系时是否看到任何问题,Many实际上意味着许多而不仅仅是少数几个,并且只是将字段设为私有,而不是getter如果整个关系是懒洋洋地提起来的话据我所知,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
}

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
}

1 个答案:

答案 0 :(得分:4)

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

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