2009-03-17 3 views
4

Es ist eine bekannte Tatsache, dass Oracle leere Zeichenfolgen als null behandelt.Oracle konvertiert leere Zeichenfolge in null, aber JPA aktualisiert Entitätscache nicht entsprechend

Ich habe jedoch ein Problem wegen dieses Verhaltens wegen JPA Caching.

Erstens behalte ich mit JPA (Toplink Essentials) eine Entität, die eine leere Zeichenfolge als ein Feld hat. Oracle konvertiert diesen Wert beim Speichern in null.

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

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

Antwort

2

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

-2

Ich denke, das Problem ist, dass Oracle die Zeichenfolge nicht als Nullwert speichert es speichert es als "Unset" -Wert (nennen wir es Super-Null). Wenn Sie also versuchen, die Werte auszuwählen, die null sind, werden Sie dieses Element nicht abrufen, da es nicht festgelegt und nicht null ist. Haben Sie versucht, speziell Null und nicht eine leere Zeichenfolge einzufügen?

ich ein Projekt einmal hatte - wo ich hatte ein ähnliches Problem, wo die Lösung speziell null in die Datenbank-Spalte zu speichern war und nicht String.Empty da es behandelt wurde, als nicht gesetzt und nicht als null ...

+0

Tatsächlich werden diese Werte als null in der Datenbank gespeichert. – tputkonen

+0

OK ... haben Sie überprüft, ob das Ergebnis DBNull ist? da java macht einen Unterschied zwischen Null und DBNull – Gambrinus

+0

Nicht sicher, was Sie meinen, aber zuerst behalte ich eine Entität mit Feld foo (leere Zeichenfolge). Oracle speichert dies als null. Dann teste ich, ob foo Null-Wert enthält, wenn nicht, versuche es in einem anderen nicht-nullbaren Feld zu speichern => Ausnahme. Ich wünschte, JPA würde foo auf die gleiche Weise aufheben, wie IDs gespeichert werden, wenn sie bestehen bleiben. – tputkonen

Verwandte Themen