代码之家  ›  专栏  ›  技术社区  ›  ssc-hrep3

Spring/Hibernate:双向映射,仅用于JPQL查询,无需同步

  •  12
  • ssc-hrep3  · 技术社区  · 6 年前

    在实体之间的双向映射中(例如。 @ManyToOne @OneToMany ),对应方需要 synchronized on every change ,尤其是使用2 nd公司 级别缓存。这通常通过助手方法完成。如果 Many 部分包含许多条目,因为每次都会提取整个集合。一个简单的例子是实体 Store 其中 n Products 鉴于 N 非常大。添加新的 Product 百货商店 将需要 百货商店 获取 产品 最后将其添加到集合中(请参见下面的代码示例)。

    有人可能会争辩说,在建模这种关系时,最好用来自 产品 百货商店 但是,我们在应用程序中使用了许多JPQL查询。在JPQL中,从两侧连接实体非常方便。

    在映射 @OneToMany公司 中的关系 百货商店 实体,何时 许多的 实际上意味着很多,而不仅仅是少数,只要将字段私有化,没有getter和setter,前提是整个关系都是懒洋洋地获取的?据我所知,Hibernate只需要字段来映射关系。如果集是私有的,则不应出现性能问题?


    这个 产品 实体:

    @Entity
    @Table(name = "product")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    public class Product {
    
      @ManyToOne(fetch = FetchType.LAZY)
      private Store store;
    
      // setter, getter, helper methods
    }
    

    这个 百货商店 实体:

    @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 回复  |  直到 6 年前
        1
  •  6
  •   Dragan Bozanovic    6 年前

    不,这没什么问题,这也是我经常使用的一种技巧。当然,只需确保该字段在某些上下文中不会被反射式访问(如自动 toString 生成器和您可能正在使用的类似实用程序)。

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