Как добавить поле перечисления в postgres?

#spring #postgresql

#spring #postgresql

Вопрос:

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

 public class ChatMessage {
private MessageType messageType;
private String content;
private String sender;

public enum MessageType {
    CHAT,
    JOIN,
    LEAVE
}
  

мой код postgre

 CREATE TYPE messageType AS ENUM ('CHAT', 'JOIN', 'LEAVE');
CREATE TABLE "chatMessage" (
id   SERIAL UNIQUE PRIMARY KEY,
messageType messageType,
content VARCHAR(255) NOT NULL,
sender VARCHAR(255) NOT NULL
);
  

Я полагаю, что я неправильно объявляю переменную enum в postgres

Ответ №1:

Используйте аннотацию с перечислением, и Spring справится с этим за вас. Но в общем случае перечисления будут VARCHAR (X) в Postgres (см. Вторую ссылку)

 public class ChatMessage {
    @Enumerated(EnumType.STRING)
    private MessageType messageType;
    private String content;
    private String sender;
}
  

http://tomee.apache.org/examples-trunk/jpa-enumerated/

https://vladmihalcea.com/the-best-way-to-map-an-enum-type-with-jpa-and-hibernate/

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

1. СОЗДАЙТЕ ТИП MessageType КАК ENUM (‘ЧАТ’, ‘ПРИСОЕДИНИТЬСЯ’, ‘ОСТАВИТЬ’); не использовать?

2. Вы можете попробовать это. Но вам нужно проверить, подходит ли Spring JPA для этого. Возможно, что @Enumerated(перечисляемый тип. СТРОКА) также запускает создание типа перечисления. Я бы на jpa создал вашу базу данных.

3. Если ваше перечисление будет расширено в вашей сущности Java, возможно, потребуется также отредактировать ваш тип перечисления postgres. Позвольте JPA управлять этим…

Ответ №2:

Если я все правильно понял, согласно документации, у вас все в порядке.

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

Другой пример:https://tapoueh.org/blog/2018/05/postgresql-data-types-enum/#postgresql-enum-data-type