在实体之间的双向映射(例如@ManyToOne
↔@OneToMany
)中,对应项需要为synchronized on every change,尤其是在使用2 nd 级别缓存时。这通常使用辅助方法完成。如果Many
部分包含大量条目,那么这些辅助方法不能很好地执行,因为每次都会获取整个集合。一个简单的例子是实体Store
,n
Products
,而n
非常大。向Product
添加新的Store
需要Store
获取Products
的完整列表,以便最终将其添加到集合中(请参阅下面的代码示例)。
有人可能会争辩说,在对这种关系进行建模时,可以更好地用Product
到Store
的单向关联来表示。我们在应用程序中使用了很多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
}
答案 0 :(得分:4)
不,它没有任何问题,这是我经常使用的一种技术。当然,只需确保在某些上下文中不会反复访问该字段(例如自动toString
构建器和您可能正在使用的类似实用程序)。
此外,您不需要@Cache
注释,因为您永远不会访问该集合,因此它永远不会被缓存。