Какой тип использовать в Java для столбца с перечислением в Postgres? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть следующая схема в PostgreSQL

student_master(
    enroll_id varchar(6),
    name varchar(25),
    class class_enum
)

Здесь class_enum - это enum, созданный с помощью

create type class_enum as enum('1','2','3')

Теперь я создаю класс модели в Java подключиться к базе данных с помощью Hibernate. Первоначально я объявил столбец «класс» с символьным типом данных, но получил следующее исключение

org.postgresql.util.PSQLException: ERROR: column "class" is of type class_enum but expression is of type character varying

Какой тип следует использовать, чтобы сопоставить эту переменную в Java классе с PostgreSQL тип столбца?

1 Ответ

0 голосов
/ 29 марта 2020

Лучший способ - предоставить enum также на стороне Java, и дать hibernate знать, как конвертировать значение в db в java.

См. Лучший способ отобразить тип Enum с JPA и Hibernate

Чтобы отобразить этот тип PostgreSQL, мы больше не можем использовать спецификацию Hibernate по умолчанию c org.hibernate.type.EnumType, поскольку PostgreSQL ожидает объект тип, а не VARCHAR или INT.

К счастью, мы можем легко создать собственный тип, расширяя org.hibernate.type.EnumType

public class PostgreSQLEnumType extends org.hibernate.type.EnumType {

    public void nullSafeSet(
            PreparedStatement st,
            Object value,
            int index,
            SharedSessionContractImplementor session)
            throws HibernateException, SQLException {
        st.setObject(
            index,
            value != null ?
                ((Enum) value).name() :
                null,
            Types.OTHER
        );
    }
}

В вашем случае, как значения (1, 2, 3) не являются допустимыми идентификаторами перечисления, вы можете добавить закрытое поле в ваше перечисление и использовать его вместо name()

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