2008-10-22 4 views
8

Ich erstelle einen benutzerdefinierten UserType in Hibernate für ein Projekt. Es war relativ einfach, bis ich zu der isMutable-Methode kam. Ich versuche herauszufinden, was diese Methode vertraglich bedeutet.Erstellen eines benutzerdefinierten Hibernate-Benutzertyps - Was bedeutet isMutable()?

Bedeutet dies, dass die Klasse, für die ich den UserType erstelle, unveränderlich ist oder bedeutet das Objekt, das einen Verweis auf eine Instanz dieser Klasse enthält, niemals auf eine andere Instanz?

Ich fand einige Beispiele in der Hibernate Community Wiki, wo sie wahr zurückgegeben, weil das Objekt selbst veränderbar war - http://www.hibernate.org/73.html.

Andere Beispiele im Wiki der Community gaben false zurück, ohne zu wissen, warum, obwohl sie auch änderbar waren.

Ich habe die JavaDoc überprüft, aber es ist auch nicht sehr klar.

Vom JavaDoc für UserType:

public boolean isMutable() 
    Are objects of this type mutable? 
    Returns: 
     boolean 

Von JavaDoc für Type:

public boolean isMutable() 
    Are objects of this type mutable. (With respect to the referencing 
    object ... entities and collections are considered immutable because 
    they manage their own internal state.) 
    Returns: 
     boolean 
+1

Links sind nicht mehr gültig fyi – Jackie

Antwort

9

Hibernate werden Arten, die als „wandelbar“ behandeln, als ob sie ändern könnte (das heißt ein Update erforderlich) ohne die auf eine neue Referenz. Wenn Sie einer Hibernate-geladenen Eigenschaft einen neuen Verweis zuweisen, erkennt Hibernate dies auch dann, wenn der Typ unveränderlich ist. Dies geschieht zum Beispiel bei String-Feldern. Aber wenn Sie sagen, Sie haben ein StringBuilder-Feld und Sie markieren es als unveränderlich Hibernate wird nicht beachten, wenn Sie den StringBuilder ändern.

Weitere Details und ein Beispielprojekt finden Sie unter this blog post.

2

Das typische Beispiel ist hier die String-Klasse - es Immutable ist, das heißt, wenn die Zeichenfolge, die Sie erstellt wird, kann nicht Ändern Sie den Inhalt oder den Status, und wenn Sie möchten, müssen Sie es in eine neue Kopie verarbeiten.

isMutable, das true zurückgibt bedeutet, dass dieses Objekt seinen Zustand von externen Objekten geändert haben kann. Wenn false zurückgegeben wird, müssen Sie dieses Objekt in eine neue Instanz kopieren und die Änderungen auf dem Weg angeben. Oder wie Sie sagten: "Bedeutet das, dass das Objekt, das einen Verweis auf eine Instanz dieser Klasse enthält, niemals auf eine andere Instanz zeigt".

+2

In der JavaDoc für Type.isMutable(), sagen sie Arrays als unveränderbar zu markieren. Aber das scheint dem zu widersprechen, was Sie gesagt haben, da Arrays ihren Zustand durch äußere Objekte verändern können. –

Verwandte Themen