it-swarm.com.ru

Избегайте вставки нулевых значений в таблицу базы данных через JPA

я начинаю с JPA2 и чувствую себя довольно комфортно. Но у меня проблема при сохранении сущностей со значениями свойства NULL для полей базы данных NON NULL со значением по умолчанию.

Я хотел бы иметь возможность оставить свойство объекта пустым и позволить базе данных вставить значение по умолчанию.

Моя текущая установка - openJPA с PostgreSQL.

У меня есть эта таблица базы данных VERSION (Vorgabewert = значение по умолчанию):


     Spalte     |             Typ             |         Attribute
----------------+-----------------------------+----------------------------
 status_        | smallint                    | not null Vorgabewert 0
 time_          | timestamp without time zone | not null
 system_time    | timestamp without time zone | not null Vorgabewert now()
 version        | character varying(20)       | not null
 activationtime | timestamp without time zone |
 importtime     | timestamp without time zone |

У меня есть объект (Java DTO), который отображает поля базы данных (кроме "статуса") с помощью конфигурации XML.

Я надеялся, что смогу вставить объект без установленного system_time, и ожидал, что база данных заполнит текущее время как значение по умолчанию.

JPA создает следующий SQL-запрос:

INSERT INTO public.version (version, activationtime, importtime, system_time, time_) VALUES (?, ?, ?, ?, ?) [params=?, ?, ?, ?, ?]

и Postgres реагирует с:

FEHLER: NULL-Wert in Spalte »system_time« verletzt Not-Null-Constraint (извините за немецкий язык, но это сообщение означает нарушение Not-Null-Constraint для 'system_time').

Так что я могу сделать? Это JPA или проблема с базой данных. Могу ли я настроить JPA для исключения нулевых свойств из оператора SQL INSERT.

Я хочу иметь возможность установить 'system_time' в моей сущности или позволить ему быть 'null' и позволить базе данных установить значение по умолчанию.

Любая помощь приветствуется!

Регадс Клаус

17
FrVaBe

Я бы не стал полагаться на значения по умолчанию в базе данных в сочетании с JPA. Вы должны будете прочитать сущность обратно после вставки, иначе у вас будет несоответствие между состоянием сущности и состоянием БД. 

Выберите здесь прагматический подход и инициализируйте все значения в Java. Никогда не слышал о способе сказать JPA/Hibernate об исключении пустых значений при вставке/обновлении.

17
bert

Использование аннотации

@Column(insertable = false)

предотвратит создание значения в sql.

20
OrangeDog

В аннотации @column поставить атрибут вставной ложно, как это:

 `@Column (имя = "system_time", вставляемый = ложь) `

Или, если вам нужно проверить, когда значение равно NULL, сделайте триггер ДО ВСТАВКИ на таблице.

5
Jorge Mario Samayoa

Из документации: columnDefinition: фрагмент SQL, который используется при создании DDL для столбца.

Используя columnDefinition, вы можете указать ограничения по мере необходимости.

@Column (name = "COLUMN_NAME", columnDefinition = "DATE ​​DEFAULT CURRENT_DATE", table = "TABLE_NAME")

В противном случае вы можете попытаться инициализировать поле в самой сущности, чтобы избавиться от этого.

@Column(name = "somedate", nullable = false)
private Date someDate = new Date();

Поэтому по умолчанию текущая дата будет вставлена, если вы ее не установите. 

2
Nayan Wadekar

Я нашел простое решение: Определить значение по умолчанию в pojo.

@Column(name="system_time")
private Date systemTime = new Date();
0
xeon_pan

Я использую это (против базы данных Oracle):

@Temporal(TemporalType.TIMESTAMP)
@Column(name="CREATION_TIME", 
        columnDefinition="TIMESTAMP DEFAULT SYSTIMESTAMP",
        nullable=false,
        insertable=false,
        updatable=false)
private Date creationTime;
0
Jim Tough

вы можете избежать свойства null, добавив nullable = false к аннотации @column. как это

@Column(name = "muColumn", nullable = false)

как избежать нулевого свойства при вставке или обновлении

0
user9247837