Frage

Gibt es eine Möglichkeit Flyweight Objekte mit dem hibernating Persistenz-Mapping zu benutzen? Mein Datenmodell enthält viele Objekte, die die gleiche sein werden. Statt eine separate Instanz für jede dieser gleichen Objekte, das würde Ich mag die Flyweight Design, Muster und Referenz verwenden, immer das gleiche physische Objekt. Wie dies zu erreichen, in Hibernate?

Btw. Sie alle JVMs die Verwendung von Strings in einer Art und Weise zu optimieren, so dass, wenn die gleiche Zeichenfolge mehrmals verwendet wird, es wird immer die gleiche physikalische Instanz sein?

War es hilfreich?

Lösung

Es hängt davon ab.

Für Nur-Lese Werte Sie können leicht ein Fliegengewicht Muster implementieren, indem Sie eine benutzerdefinierte Usertype zu schaffen, die Objekte aus einem Pool statt neuer Instanzen jedes Mal zurück.

Für Entitäten ist Hibernate standardmäßig gesund und will über Transaktionen konsequent sein und werden somit nicht Einheiten zwischen Sessions teilen Rennbedingungen Ihrer Daten zu vermeiden - und ich glaube nicht, das ist, was Sie wollen.

Aber für den Fall ist es (und das ist völlig nicht-empfohlen, ohne wirklich zu wissen, was Sie tun) Sie Interceptor.getEntity implementieren können (), die für die zweite Level-Caching gedacht. Bei diesem Verfahren können Sie eine Entität zurückgeben (auch einige von anderen Sitzungen gemeinsam) und Sie werden effektiv ein Fliegengewicht Muster für Ihre Entitäten haben.

Aber ich empfehle dagegen sehr für die Konsistenz Ihrer Daten -. Viel besser von Entitäten verwiesen tatsächliche unveränderliches Fliegengewicht Werte zu haben, als auch versuchen, und die tatsächlichen Einheiten Fliegengewicht

Andere Tipps

Ja, können Sie das Flyweight-Muster mit Hibernate implementieren.

Das Fliegengewicht Muster Art und Weise der Speichernutzung pro Instanz zu minimieren. Die Strategie ist so viel Staat zwischen Fliegengewicht Instanzen wie möglich zu teilen. In Ihrem Fall der gemeinsam nutzbaren Zustand ist alles außer dem Hibernate-Objekt-ID und einige zusätzliche Zustandsobjektidentität zu erhalten .

Jede Fliegengewicht Instanz eine eigene Objektidentität . Der zusätzliche Zustand ist die Art und Weise Identität zu implementieren zwischen Objekten zu unterscheiden, dem gemeinsamen Staat teilen.

public boolean equals(Object obj){
  Fly other; [..]//check type
  //null checks ommitted
  return other.myState.equals(myState) && other.commonState.equals(commonState); 
}

Wenn die Objektidentität zwischen Instanzen gemeinsam genutzt wird winter würden alle physischen Instanzen (Referenzen) als die gleiche Instanz interpretieren. Im Ruhezustand wird die Methode equals Objektidentität und Ihre gleich Implementierung hat (! a.equals(a) == true) zurückkehren würde zu überprüfen, die illegal ist. Equal hat reflexiv sein. Wenn Sie diesen Vertrag alle Bibliotheken brechen würde, die auf dem Vertrag abhängen wird gebrochen (Sammlungen, Hibernate, usw.).

Sie können nicht die gleiche Methode mit dem Hibernate-Objekt-ID implementieren zwischen Objekten zu unterscheiden. Dies würde die Objektidentität abhängig von der Persistenz Zustand (beharren oder transiente) machen.

Eine Möglichkeit, den gemeinsamen Staat in Hibernate zu modellieren ist eine Eins-zu-viele-Beziehung zwischen gemeinsam genutzten Zustand Objekten und Fliegengewicht Objekten. (Vielleicht hat jemand eine Idee, wie die Daten abzubilden, ohne zwei Tabellen verknüpft?)

String: Nur

  

Sie alle JVMs optimieren die Verwendung von Strings in einer Art und Weise, so dass, wenn die gleiche Zeichenfolge mehrmals verwendet wird, es wird immer die gleiche physikalische Instanz sein?

Ich bezweifle, dass sehr viel. In der gleichen Klasse-Datei, wenn definined wie:

String s1 = "Yes";
String s2 = "Yes";

Sie werden wahrscheinlich haben s1 == s1.

Aber wenn man wie:

String x = loadTextFromFile(); // file contains es
StringBuilder b = new StringBuilder();
s2 = b.append("Y").append(x).toString(); // s2 = "Yes"

Ich glaube nicht, dass die Laufzeit alle geht zu überprüfen und vergleichen Sie die geladenen Strings der Rückgabewert von ihnen Builder.

Also, immer vergleichen Objekte mit equals (). Das ist ein guter Rat sowieso da alle guten Gleichen beginnt mit:

if (this == o) {
    return true;
}

Wenn Sie Ihre Objekte Gleichheit von Identität implementieren, wird Hibernate hat nur die einzige Instanz mit dem Primärschlüssel zugeordnet ist. Ich glaube nicht, dass es genau die gleiche Idee wie Fliegengewicht, aber der Punkt ist, dass man nicht viele Instanzen des gleichen Hibernate Objekts haben wird.

scroll top