我在远程项目上工作,并在日志中找到了有趣的记录:
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
列。
答案 0 :(得分:4)
默认情况下,所有属性都会保留,就好像它们标有@Basic
注释一样。
要避免字段被保留,您可以选择以下选项:
@Transient
static final
字段,但是您可能希望将其移至常量类实用程序java.time.Month
,然后将月份名称国际化,这样您就可以在UI中支持多种语言,同时在数据库中存储通用名称。