4 Stimmen

Oracle wandelt einen leeren String in null um, aber JPA aktualisiert den Entity-Cache nicht entsprechend

Es ist bekannt, dass Oracle leere Zeichenketten als Null behandelt.

Allerdings habe ich ein Problem wegen dieses Verhaltens aufgrund von JPA-Caching.

Zuerst habe ich mit JPA (Toplink Essentials) eine Entität aufrechterhalten, die einen leeren String als ein Feld hat. Oracle konvertiert diesen Wert in Null, wenn es ihn speichert.

Wenn ich jedoch die Entität abrufe, scheint JPA sie aus dem Cache zurückzugeben, wo dieses Feld immer noch eine leere Zeichenfolge ist. JPA scheint nicht zu wissen, dass das, was in der Datenbank gespeichert wurde, eigentlich ein Nullwert war, und diese Inkohärenz verursacht Probleme.

Gibt es eine Möglichkeit, dieses Problem auf der JPA- oder Anwendungsserver (Oracle AS) Konfigurationsebene zu lösen? Dies ist etwas, das ich nicht in der Anwendungsebene beheben möchte (aber tun wird, wenn es notwendig ist).

2voto

tputkonen Punkte 5379

Wir sind auf EclipseLink umgestiegen, das @ReturnInsert- und @ReturnUpdate-Annotationen unterstützt. Diese helfen dabei, das Feld mit dem Wert zu aktualisieren, der tatsächlich in der Datenbank gespeichert wurde.

-2voto

Gambrinus Punkte 2140

Ich denke, das Problem ist, dass Oracle die Zeichenfolge nicht als Nullwert speichert, sondern als "nicht gesetzten" Wert (nennen wir ihn Supernull). Wenn Sie also versuchen, die Werte auszuwählen, die Null sind, können Sie dieses Element nicht abrufen, da es nicht gesetzt und nicht Null ist. haben Sie versucht, speziell Null und nicht eine leere Zeichenfolge einzufügen?

Ich hatte mal ein Projekt, bei dem ich ein ähnliches Problem hatte, bei dem die Lösung darin bestand, speziell null in der Datenbankspalte zu speichern und nicht string.empty, da es als nicht gesetzt und nicht als null behandelt wurde...

0 Stimmen

Tatsächlich werden diese Werte in der Datenbank als Null gespeichert.

0 Stimmen

Okay ... haben Sie überprüft, ob das Ergebnis DBNull ist? seit Java macht einen Unterschied zwischen null und DBNull

0 Stimmen

Ich bin mir nicht sicher, was Sie meinen, aber zunächst bestehe ich auf einer Entität mit dem Feld foo (leerer String). Oracle speichert dies als Null. Dann teste ich, ob foo den Wert null enthält, wenn nicht, versuche ich, es in einem anderen nicht löschbaren Feld zu speichern => Ausnahme. Ich wünschte, JPA würde foo auf die gleiche Weise nullen, wie es id's beim Persistieren speichert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X