【问题标题】:Hibernate/JPA: storing constants in entity class?Hibernate/JPA:在实体类中存储常量?
【发布时间】:2016-03-31 17:52:05
【问题描述】:

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

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 列。

【问题讨论】:

  • 静态的?短暂的? @短暂的。方法丰富。如果某个东西是一个常量,那么它无论如何都应该是静态的......但这与 JPA 无关,而与 Java 无关

标签: java hibernate jpa constants hibernate-mapping


【解决方案1】:

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

为避免字段被持久化,您有以下选项:

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

【讨论】:

  • final 关键字对于常量来说是很自然的。仅static 就足以避免归档被持久化吗?我是这么想的,但又怕有什么隐藏的东西……
  • 你可以使用静态,然后Hibernate不会持久化这些字段。
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 2015-06-12
  • 2012-07-16
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
  • 2010-10-31
相关资源
最近更新 更多