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
, а затем интернационализация имени месяца, чтобы вы могли поддерживать несколько языков в пользовательском интерфейсе, сохраняя универсальное имя в базе данных.