Исключение CommandAcceptanceException с @ColumnDefault

#hibernate #jpa #jboss #quarkus

Вопрос:

У меня включена генерация схемы в приложении.свойства.

 quarkus.hibernate-orm.database.generation.create-schemas=true
quarkus.hibernate-orm.database.generation=update
 

Поэтому, когда я загружаю приложение и hibernate пытается сгенерировать таблицы, я получаю эту ошибку:

 GenerationTarget encountered exception accepting command :
    Error executing DDL "alter table line add constraint FKplr0g1vlmngsgvsj9eskryujs foreign key (id) references task (taskId)"
    via JDBC Statement: org.hibernate.tool.schema.spi.CommandAcceptanceException:
    Error executing DDL "alter table line add constraint FKplr0g1vlmngsgvsj9eskryujs foreign key (id) references task (taskId)"
 

Это проблема при использовании аннотации @ColumnDefault с пользовательским перечислением TaskStatus . Вот что у меня есть:

 public class Task {

    @Id
    @GeneratedValue(generator = "id-generator")
    @Type(type = "uuid-char")
    @Column
    private UUID taskId;
  
    @Enumerated(EnumType.STRING)
    @Column
    @ColumnDefault("INCOMPLETE")
    private TaskStatus status;

    ...
}

 

Кто-нибудь знает, почему Hibernate не может создать ограничение по умолчанию для этого столбца?

Обновить:

Если я инициализирую поле сущности, проблема в том, что оно будет иметь значение по умолчанию только для этого приложения, а не для любых других приложений, которые вызывают базу данных. В то время как если я полагаюсь на определение столбца для предоставления значения по умолчанию, Hibernate, похоже, передает значение null и перезаписывает значение по умолчанию. На данный момент я решаю эту проблему, используя комбинацию обоих решений:

 @Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum('INCOMPLETE','QUEUE','ACTIVE','COMPLETE') default 'INCOMPLETE' not null")
private TaskStatus status = TaskStatus.INCOMPLETE;
 

Если кто-нибудь может объяснить такое поведение, мне очень интересно.

Комментарии:

1. У меня сложилось впечатление , что вы должны избегать значения @ColumnDefault , как если бы оно дословно использовалось в сгенерированном операторе SQL. Итак, если INCOMPLETE это имя одного из значений TaskStatus перечисления (я думаю), укажите что-то вроде @ColumnDefault("'INCOMPLETE'") .

2. Не повезло, ничего не вышло.