Hibernate/JPA: сохранение констант в классе сущностей?

Я работаю над удаленным проектом и нашел интересную запись в журнале:

2015-12-26 00:28:30,835 DEBUG org.hibernate.tool.hbm2ddl.SchemaUpdate
  Caller+0   at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:251)
  => alter table bail add column monthName tinyblob

с регистрацией, установленной на:

<logger level="trace" name="org.hibernate.tool.hbm2ddl"/>

когда попытайтесь определить, что произойдет с:

<prop key="hibernate.hbm2ddl.auto">update</prop>

при первом запуске из резервной копии.

Когда я увидел источник Bail.java, я удивлен:

String[] monthName = {"Января", "Февраля",
        "Марта", "Апреля", "Мая", "Июня", "Июля",
        "Августа", "Сентября", "Октября", "Ноября",
        "Декабря"
};

Итак, это постоянное поле!

Правильно ли хранить декларацию констант в классе сущности в JPA/Hibernate?

Как мне пометить константу, чтобы она не была свойством entity?

Я думаю, что ключевое слово static выполняет эту работу, и я думаю о рефакторинге кода:

public static final String[] monthName = 
    Collections.unmodifiableList(Arrays.asList(
        "Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля",
        "Августа", "Сентября", "Октября", "Ноября", "Декабря"
));

Поскольку производственная версия, развернутая с помощью hbm2ddl.auto=update, я думаю, что я должен предупредить DBA об удалении ненужного столбца monthName.

Ответы

Ответ 1

Все свойства сохраняются по умолчанию, как если бы они были помечены аннотацией @Basic.

Чтобы избежать сохранения поля, у вас есть следующие параметры:

  • вы можете пометить его @Transient
  • вы можете сделать это поле static final, но тогда вы, возможно, захотите перенести его в утилиты класса констант
  • наилучшим подходом является использование Java 8 java.time.Month, а затем интернационализация имени месяца, чтобы вы могли поддерживать несколько языков в пользовательском интерфейсе, сохраняя универсальное имя в базе данных.