Frage Spring / Hibernate: Bidirektionales Mapping ohne Synchronisation nur für JPQL-Abfragen


Bei einer bidirektionalen Abbildung zwischen Entitäten (z.B. @ManyToOne ↔ @OneToMany), muss das Gegenstück sein synchronisiert bei jeder Änderung, besonders bei Verwendung einer 2nd Level-Cache. Dies wird normalerweise mit Hilfsmethoden gemacht. Diese Hilfsmethoden funktionieren nicht gut, wenn der Many Teil enthält viele Einträge, da jedes Mal der ganze Satz abgerufen wird. Ein einfaches Beispiel wäre eine Entität Store was hat n  Products, wohingegen n es ist sehr groß. Hinzufügen eines neuen Product zum Store würde das verlangen Store um die ganze Liste von zu holen Products um es schließlich zur Gruppe hinzuzufügen (siehe Codebeispiel unten).

Man könnte argumentieren, dass es beim Modellieren einer solchen Beziehung besser mit einer unidirektionalen Assoziation von der Product zum Store. Wir verwenden jedoch viele JPQL-Abfragen in unserer Anwendung. In JPQL ist es sehr praktisch, Entitäten von beiden Seiten zu verbinden.

Siehst du Probleme beim Mappen der @OneToMany Beziehung in der Store Entität, wann Many bedeutet eigentlich viele und nicht wenige, und mache das Feld nur privat, ohne Getters und Setter, vorausgesetzt, dass die ganze Beziehung faul ist? Wie ich es verstehe, benötigt Hibernate nur das Feld, um die Relation zuzuordnen. Und wenn das Set privat ist, sollten keine Leistungsprobleme auftreten?


Das Product Entität:

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

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

  // setter, getter, helper methods
}

Das Store Entität:

@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
}

11
2018-04-20 15:12


Ursprung


Antworten:


Nein, daran ist nichts falsch, es ist eine Technik, die ich oft benutzt habe. Stellen Sie natürlich sicher, dass das Feld nicht reflektiv in einem Kontext (wie automatisch) zugegriffen wird toString Builders und ähnliche Dienstprogramme, die Sie möglicherweise verwenden).

Außerdem brauchst du das nicht @Cache Anmerkung dazu, da Sie sowieso nie auf die Sammlung zugreifen werden, daher wird sie niemals zwischengespeichert.


4
2018-04-23 12:48