2009-08-12 7 views
2

Ich habe ein Hibernate-Modell, das einen benutzerdefinierten Typ verwendet, um boolesche Felder darzustellen (dh Modell hat ein Boolesches Objekt, aber die Datenbank) schreibt eine 0 oder 1 in ein TINYINT-Feld.Wenn Sie den Wert des booleschen Objekts von (true in false oder false in true) ändern, ändert sich der Wert für das Objekt, aber der Hibernate-Sitzungsmanager scheint das Objekt nicht zu haben Werte ändern sich und daher save() schreibt nicht wirklich SQL in die DB.Hibernate-Feld mit benutzerdefinierten Typänderungen, aber Objekt nicht als 'schmutzig' für das Update markiert

Muss ich etwas besonderes in meinem benutzerdefinierten Typ tun, um es zu sehen, Änderungen zu ändern? Ich würde es vorziehen, jedes Objekt auf "schmutzig" zu zwingen selbst in Accessoren, aber das ist auch möglich

Antwort

1

Erstens, gibt es einen Grund, dass Sie Ihren benutzerdefinierten Typ anstelle des integrierten booleschen Typs von Hibernate verwenden?

<property name="some_flag" type="boolean"/> 

Zweitens, nein, Sie brauchen nichts „Besonderes“ in Ihrem benutzerdefinierten Typ zu tun, aber Sie müssen richtig unter anderem seine equals() und deepCopy() Methoden implementieren. Kannst du die Quelle posten?

0

save() speichert das Objekt (oder seine Änderungen) nicht wirklich in der Datenbank. Es markiert es als persistent, d. H. Ein Objekt, von dem Hibernate denkt, dass es verwaltet wird. Wenn das Objekt losgelöst ist, rufen Sie update().

Sind Sie flushing the Session, wenn Ihre Arbeit erledigt ist? Und/oder closing it?

Vielleicht mögen Sie nochmals überprüfen, das Hibernate-Handbuch auf Modifying Persistent Objects (Ich sage nicht, diese schnippisch zu sein, ich hatte das gleiche Problem mit Hibernate selbst heute - vergessen, den Unterschied zwischen save() und anderen Methoden, und auch vergessen zu flush() meine Sitzung).

2

Es gibt zwei Lösungen.

  1. Hibernate ruft gleich Methode zu überprüfen, ob das Objekt geändert wurde oder nicht, und vor, dass es nennt deepcopy Methode Kopie des benutzerdefinierten Objekts zu erhalten. Erstellen Sie in Ihrer deepCopy-Methode eine neue Kopie des benutzerdefinierten Objekts und implementieren Sie die equals-Methode korrekt.

  2. Zweite Lösung verwendet Mix Ansatz AccessType.FIELD und AccessType.PROPERTY. Obwohl dies nicht empfohlen wird, aber Sie können sehen, ob es Ihnen Wissen gibt.

Dies scheint als Ihre Zuordnung sollte ähnlich sein wie unten.

@Entity @Table (name = TABLE_NAME)

@access (AccessType.FIELD)

public class entityClass {

/// --- einige Felder

@Column (name = "CustomCol")

@Typ (type = "com.etwas.CustomColType ")

Customcustom;

// - Getter settters

}

Wenn Sie benutzerdefinierte Objekt in ur-Klasse und Sie das Objekt nur ändern, dann ist es nicht so nicht markieren . schmutzig Lösung 1: mit Custom Objekt ein anderes Attribut aktualisieren Lösung 2:. setzen @access (AccessType.PROPERTY) auf Custom Feld und Getter/Setter für gleiche bieten Diese überschreiben. Standardverhalten von AccessType.Field, das Sie auf Klassenebene festlegen.

Dieses Problem wird nicht reproduzierbar sein, wenn Sie @access (AccessType.PROPERTY) auf Klassenebene haben.

Verwandte Themen