#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