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

时间:2015-12-25 22:54:09

标签: java hibernate jpa constants hibernate-mapping

我在远程项目上工作,并在日志中找到了有趣的记录:

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术语在实体类中存储常量声明是否正确?

我应该如何标记常数以使它不是实体属性?

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

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

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

1 个答案:

答案 0 :(得分:4)

默认情况下,所有属性都会保留,就好像它们标有@Basic注释一样。

要避免字段被保留,您可以选择以下选项:

  • 您可以使用@Transient
  • 进行标记
  • 您可以将其设为static final字段,但是您可能希望将其移至常量类实用程序
  • 最好的方法是使用Java 8 java.time.Month,然后将月份名称国际化,这样您就可以在UI中支持多种语言,同时在数据库中存储通用名称。