Oracle преобразует пустую строку в ноль, но JPA не обновляет кэш сущностей соответственно - PullRequest
4 голосов
/ 17 марта 2009

Это хорошо известный факт, что Oracle рассматривает пустые строки как ноль.

Однако у меня возникла проблема из-за этого поведения из-за кеширования JPA.

Сначала я продолжаю использовать JPA (Toplink Essentials) сущность, которая имеет пустую строку в качестве одного поля. Oracle преобразует это значение в ноль при его сохранении.

Однако, когда я выбираю объект, JPA, кажется, возвращает его из кэша, где это поле все еще является пустой строкой. JPA, похоже, не знает, что то, что было сохранено в базе данных, было фактически нулевым значением, и это непоследовательность вызывает проблемы.

Есть ли способ решить эту проблему на уровне конфигурации JPA или сервера приложений (Oracle AS)? Это то, что я не хотел бы исправлять на уровне приложения (но сделаю, если это необходимо).

Ответы [ 2 ]

2 голосов
/ 15 мая 2009

Мы перешли на EclipseLink, который поддерживает аннотации @ReturnInsert и @ReturnUpdate. Они помогают обновить поле значением, которое фактически было сохранено в базе данных.

0 голосов
/ 17 марта 2009

Я думаю, что проблема в том, что Oracle не хранит строку как нулевое значение, а хранит ее как «unset» -значение (назовем это super-null). поэтому, если вы попытаетесь выбрать значения, которые являются нулевыми, вы не получите этот элемент, потому что он не установлен и не равен нулю. Вы пытались вставить специально ноль, а не пустую строку?

Однажды у меня был проект - где у меня была похожая проблема, где решение заключалось в том, чтобы хранить конкретно null в столбце базы данных, а не в string.empty, поскольку он рассматривался как не установленный и не как нулевой ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...