Spring Data JPA и значения по умолчанию - PullRequest
1 голос
/ 30 апреля 2019

в моей таблице базы данных у меня есть значение по умолчанию для такого атрибута, как

CREATE TABLE my_table (
   ...
   my_attribute INTEGER DEFAULT 0,
   ...
);

Если я пытаюсь сохранить свой Java-объект с помощью Spring Data repo.save (object), а затем выполнить поиск по id с помощью findById(id), я получаю объект, но значение по умолчанию не устанавливается, если я использую Integer (не int).

Почему он не установлен?

Как это исправить?

Если я вставлю запись в свою таблицу с помощью SQL, будет установлено значение по умолчанию 0.Хм ...

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

, поскольку null также является значением:

Что происходит в коде?

При звонке:

private Integer myAttribute;

значение по умолчанию null, потому что Integer является объектом. поэтому, когда вы пытаетесь вставить нулевое значение, даже если DEFAULT 0 JPA установит null в myAttribute, запрос должен выглядеть так:

INSERT INTO table0002 values (null);

.. и когда вы ВСТАВЛЯЕТЕ null, проверьте, что происходит в демоверсии:

https://rextester.com/IJUT84677

значение вставлено! с null, а не с 0.

Теперь давайте попробуем другой INSERT без указания my_attribute в запросе:

https://rextester.com/FGASH67830

Мы не указываем my_attribute в запросе, поэтому используется значение по умолчанию. в документации сказано:

5,2. Значения по умолчанию

Столбцу может быть назначено значение по умолчанию. Когда создается новая строка и не указаны значения для некоторых столбцов, эти столбцы будут заполнены соответствующими значениями по умолчанию . Данные Команда манипуляции также может явно запросить, чтобы столбец был установлен к значению по умолчанию


Чтобы решить эту проблему, вы можете просто использовать:

private Integer myAttribute = 0; // set hard value in the code

Кроме того, вы также можете использовать NOT NULL, чтобы убедиться, что запрос не будет вставлять NULL:

my_attribute INTEGER NOT NULL DEFAULT 0

это может вызвать violates not-null constraint, поэтому будьте осторожны, вы должны установить значение по умолчанию, отличное от NULL, при вызове вставки, проверьте, что вы получите, если попытаетесь это сделать.

https://rextester.com/LMTTOO35342

0 голосов
/ 01 мая 2019

Я не уверен. Если вы устанавливаете значение по умолчанию только в своей базе данных, ответ может быть в состоянии объекта. Я имею в виду, что вы используете данные из сеанса, где не установлено значение по умолчанию. В этом случае вы можете использовать метод flush () (из EntityManager).

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