2010-06-10 16 views
5

Ich sehe, dass die Methoden session.get() und load() von hibernate nur Serializable-Objekte akzeptieren.Warum Hibernate Erzwingen der Serialisierung in session.get-Methode

Nach meinem Verständnis von Hibernate wird es eine SQL-Anweisung generieren und an DBMS senden. Es wird niemals ein Java-Objekt über das Netzwerk senden müssen.

Warum Hibernate erzwingt Serialisierung auf uns?

Antwort

0

Ich denke, es ist wegen der Unterstützung für Caching. Wenn Sie einen persistenten Cache oder ein Caching verwenden, das Objekte über das Netzwerk verteilt, müssen Sie sicherstellen, dass die Objekte in einem gemeinsamen Format transportiert werden können, in diesem Fall in der Java-Serialisierung.

+1

aber ist dieses Zwischenspeichern über mehrere JVMs Standardoption? Ich denke es ist nicht, und wenn ich Cache oder Cluster konfiguriere, würde ich meine Objekte serialisierbar machen. Aber warum Hibernate muss mich zwingen, Serialisierung zu verwenden, wenn ich keinen verteilten Cache verwende? – Reddy

+0

Nein, es ist nicht standardmäßig aktiviert. Ich würde vermuten, dass das Durchsetzen der serialisierbaren Implementierung einen Entwickler erkennen lassen sollte, dass ein Wertobjekt einer Serialisierung unterliegen könnte und daher auf diese Weise entworfen werden sollte. Nur eine Vermutung, ich habe nie wirklich darüber nachgedacht und habe es nicht einmal erkannt, bis ich deine Frage gelesen habe. – perdian

0

Ich sehe es ehrlich gesagt nicht anders. Wenn Sie nicht die Tabellenstruktur definieren und INSERT-Anweisungen für Objekte erstellen, ist die generierte SQL-Anweisung eine Zeichenfolge und fügt eine weitere Zeichenfolge (Ihre serialisierten Daten) in ein Feld einer Tabelle ein. Was immer Sie in eine Datenbank einfügen, muss in diesem Fall eine Zeichenfolge sein. Es kann kein Objekt mit sprachabhängigen Methoden sein, es sei denn, Sie erstellen explizit eine Tabelle, um solche Daten zu speichern.

+1

1. get() und load() fügt nichts in die Tabelle ein, ruft nur eine existierende Entität ab, 2. Der ganze Punkt von Hibernate ist objektrelationales Mapping (ORM), dh dass die Eigenschaften des Objekts zugeordnet sind Tabellenspalten nacheinander (mehr oder weniger) in einer explizit gestalteten Weise. Standardmäßig erfolgt keine Serialisierung, es sei denn, Sie definieren sie explizit (und Sie benötigen dafür wahrscheinlich einen benutzerdefinierten Zuordnungstyp). –

+0

Guter Punkt. Ich habe Ihre Frage falsch verstanden. Jedoch habe ich diese zuvor zum Speichern von Referenzen, d. H. IDs für Objekte, verwendet, so dass die Serialisierung als Speicheransatz sinnvoll war. Meine Erfahrung kann in diesem Fall ein bisschen begrenzt sein. – Raine

1

Dies ist nicht ganz richtig. From the Javadoc, die Signatur der relevanten Methoden:

public Object get(Class clazz, Serializable id) ... 
public Object load(Class theClass, Serializable id) ... 

(irrelevante Teile und andere der Kürze halber weggelassen ladenen Versionen).

So kann die zu ladende Entität jeder Klasse sein, nur seine Kennung muss serialisierbar sein.

Entities tatsächlich net nicht serializable, wie in diesem Zitat aus Java Persistence with Hibernate, ch. 13.3.2:

Persistente Instanzen werden im Second-Level-Cache in einem disassemblierten Formular gespeichert. Stellen Sie sich die Disassemblierung als einen Prozess vor, der ein bisschen wie eine Serialisierung ist (der Algorithmus ist jedoch viel schneller, als Java-Serialisierung ).

Also würde ich vermuten, die Bezeichner (im Abfragecache) sind auch nicht serialisiert. Ich konnte keine Erklärung finden, warum idSerializable erklärt wird, und das fehlt, kann ich nur raten. Die API benötigt einen Typ für den Parameter id, der ein gemeinsamer Supertyp mindestens der häufig verwendeten Bezeichner-Typen Number und String sein sollte, und abgesehen von Object ist Serializable die einzige Wahl.

+1

true, aber warum muss der Identifier serialisierbar sein? – Reddy

5

Vor allem die Tatsache, dass Hibernate verwendet Serializable in irgendeiner Unterschrift bedeutet nicht, dass Hibernate wird etwas serialisiert, es bedeutet nur, dass die Parameter serializable sind, wenn die Notwendigkeit entsteht.

Dann konnte ich nicht eine absolute Referenz finden, aber ich denke, dass das stärkste Argument ist:

  • Entities Ids Verwendung als Schlüssel für das Caching (erste Ebene, zweite Ebene) und kann über die gesendet werden Draht

Einige schwächere Argumente (oder nicht Argument überhaupt):

  • die Session selbst kann möglicherweise (zB serialisiert werden im 01 gespeichert werden)
  • Hibernate benötigt ein Supertyp für entityId (einschließlich Verbund PK)

alles gegeben, ich denke, es macht Sinn Nutzer der API zur Durchsetzung eines Serializable entityId passieren, ermöglicht dies keine Tür schließen und um spätere Beschränkungen zu vermeiden (oops, Sie können das Second-Level-Caching nicht aktivieren, da dieses Pk nicht Serializable ist). Dies ist IMO eine viel bessere Design-Entscheidung als mit Object. Und ehrlich gesagt, sehe ich keinen Ärger damit.

+0

Ich habe wirklich kein Problem mit Serializable. Aber mein Punkt ist, warum jemand anderes mir etwas aufzwingen muss, auch wenn es eine sehr gute Übung ist? – Reddy

Verwandte Themen