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 中支持多种语言,同时在数据库
我在远程项目上工作,在日志中发现有趣的记录:
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 中支持多种语言,同时在数据库