LINUX.ORG.RU

spring, hibernate, postgresql

 , , ,


0

2

У меня есть проект, в котором используется сабж. Имеются сущности с маппингами через аннотации. В сущностях используется enum postgresql. Если я пытаюсь разворачивать БД с помощью свойства hibernate.hbm2ddl.auto, то это заканчивается ошибкой, ибо перечислений нет и hibernate не может генерировать для них DDL. Есть предварительно создать в БД вручную перечисления, про развертывание проходит корректно. Вопрос 1: может ли hibernate автоматически генерировать ddl и для перечислений? Вопрос 2: как мне при выполнении развертывания БД предварительно вызвать скрипт, в котором будут прописано создание перечислений?


По первому вопросу не уверен, что сможет, всё-таки enum - это нестандартная фича.

По второму, смотри инструменты для миграций, тот же flyway или liquibase.

hippi90 ★★★ ()

Лучше всего вообще ничего не генерировать, а писать миграции руками. В крайнем случае можно сгенерировать, провести аудит сгенерированных скриптов и их использовать. В твоём случае надо просто дописать нужные строчки. А этот auto тебе когда-нибудь базу грохнет.

Legioner ★★★★★ ()

Постгря не умеет в Create Database If not exist. Хибирнейт, вроде как, падает на этом самом моменте. На счет енумов - не уверен, что хибирнейт умеет их корректно создавать вообще.

Так что добавляй в зависимости какой-нибудь flywaydb и сделай нормальные миграции.

nihirash ★★ ()
Ответ на: комментарий от Legioner

Проект небольшой, для обучения. Пока не добавила перечисления все шло нормально. Но теперь приходится таскать скриптик и вручную его накатывать. Неудобно, однако.

totik ()

встречные вопросы.

Зачем ты используешь перечисления СУБД? не проще ли использовать перечисления Java, но хранить их как числа или строки?

вот, к примеру, string-stored вариант:

    public enum STATUS {

        REQUESTED("requested"),
        PAYMENT("payment"),
        PREPARING("preparing"),
        READY("ready"),
        ONLINE("online"),
        FINISHED("finished"),
        ABORTED("aborted")
        ;

        private String status;

        STATUS(String status) {
            this.status = status;
        }

        public String get() {
            return status;
        }
    }

    @Column
    @Enumerated(EnumType.STRING)
    private STATUS status;

и енумы используешь, и хранишь адекватно.

bvn13 ★★★★★ ()

hibernate.hbm2ddl.auto

Это только для тестов используют. На боевом сервере люди заморачиваются с всесторонностью DDL, надо же как то изменения в БД организованно выкатывать, потому никакой автогенерации.

anonymous ()
Ответ на: комментарий от totik

Проект небольшой, для обучения.

В таком случае затащить Liquibase / Flyway - идеальное решение. Это простые либы и используются повсеместно, можно даже в CV записать.

Irben ★★ ()
Ответ на: комментарий от bvn13

У нас на предприятии софт пишут на C++/Qt, в постгресе активно применяют перечисления и составные типы. Я изучаю джаву решая мелкие задачи, применимые к нашей области и нашим проектам.

totik ()