Гибернация с PostgreSQL с использованием значения по умолчанию в Entity - PullRequest
1 голос
/ 10 июля 2020

Я разрабатываю API, используя Springboot и PostgreSQL 12. Я создал пользовательскую таблицу со спящим режимом, и поле объекта, которое вызывает проблемы c, выглядит следующим образом:

@Column(columnDefinition = "BOOLEAN NOT NULL DEFAULT FALSE")
private Boolean emailVerificationStatus = false;

Моя таблица кажется для правильной генерации:

create table users (
   id int8 generated by default as identity,
    email varchar(120) not null,
    email_verification_status boolean default false not null,
    email_verification_token varchar(255),
    encrypted_password varchar(255) not null,
    first_name varchar(50) not null,
    last_name varchar(50) not null,
    user_id varchar(255) not null,
    primary key (id)
)

Моя проблема заключается в том, что при запуске приложения я получаю сообщение об ошибке:

org.hibernate.PropertyValueException: not-null property references a null or transient value : fr.mycompany.app.io.entity.UserEntity.emailVerificationStatus

По умолчанию, когда я создаю пользователя, он отправляет нулевое значение . Я могу решить эту проблему, установив значение false в моем слое обслуживания, но это не очень элегантно. Кроме того, когда я удаляю параметр nullable = false, он работает нормально, но вместо значения по умолчанию устанавливается значение null. Кажется, что postgresql не принимает значение по умолчанию (false) в качестве значения, когда я пытаюсь отправить пользователя в свой API. Я хочу принудительно изменить значение null на false по умолчанию.

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

В соответствии с документацией hibernate вы можете попробовать использовать следующий подход:

@Entity
@DynamicInsert
public class YourEntity {

  @ColumnDefault("false")
  private Boolean emailVerificationStatus;

  // ...
}

Обратите внимание, что приведенный выше объект снабжен аннотацией @DynamicInsert, так что * Оператор 1007 * не включает никаких атрибутов сущности, не содержащих значения. Таким образом, это позволяет избежать случая, описанного в ответе @MikeOrganek.

1 голос
/ 10 июля 2020

Вам необходимо решить эту проблему на уровне обслуживания.

PostgreSQL соответствует стандарту SQL. Значение default clause действует только в том случае, если столбец не указан в списке столбцов или если default указан в списке значений. Когда Hibernate запускает insert, emailVerificationStatus явно включается как null.

См.: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

Раздел " , "" Общие правила ", 4b, на стр. 389, определяет поведение при вставке.

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