Hibernate/JPA:在实体 class 中存储常量?

Hibernate/JPA: storing constants in entity class?

我在远程项目上工作,在日志中发现有趣的记录:

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 而言,在实体 class 中存储常量声明是否正确?

我应该如何标记常量使其不是实体 属性?

我认为 static 关键字可以完成工作,我考虑将代码重构为:

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

因为使用 hbm2ddl.auto=update 部署的生产版本我想我应该警告 DBA 删除不必要的 monthName 列。

默认情况下保留所有属性,就像用 @Basic 注释标记一样。

要避免字段被持久化,您有以下选择:

  • 可以用@Transient
  • 标记
  • 你可以把它变成一个 static final 字段,但是你可能想把它移到常量 class 实用程序中
  • 最好的方法是使用 Java 8 java.time.Month,然后将月份名称国际化,这样您就可以在 UI 中支持多种语言,同时在数据库