其他分享
首页 > 其他分享> > Hibernate / JPA:在实体类中存储常量?

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

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

我认为使用static关键字可以完成工作,并且可以将代码重构为:

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

因为生产版本是通过hbm2ddl.auto = update部署的,所以我认为我应该警告DBA删除不必要的monthName列.

解决方法:

默认情况下,所有属性都将保留,就像它们被标记为@Basic一样.

为避免保留字段,您可以使用以下选项:

>您可以将其标记为@Transient
>您可以将其设置为静态的final字段,但是无论如何您可能想要将其移至常量类实用程序
>最好的方法是使用Java 8 java.time.Month,然后国际化月份名称,以便您可以在UI中支持多种语言,同时在数据库中存储通用名称.

标签:constants,jpa,hibernate,hibernate-mapping,java
来源: https://codeday.me/bug/20191027/1945277.html