返回介绍

定义一个持久化的枚举类型

发布于 2025-04-21 21:42:13 字数 2960 浏览 0 评论 0 收藏

枚举类型(enumerated type)是程序设计当中常见而且有用的抽象,可以让你从一组固定的命名选项中选取其值。枚举类型最初在 Pascal 中的表达形式相当不错,但 C 语言只实现了最基本的枚举类型(基本上只能把符号名称指定给某些可交换的整数值),结果早期的 Java 版本只保留了 C 语言的 enum 关键字,却一直没有实现它。一种名为“类型安全的枚举模式”(typesafe enum pattern)的面向对象的优秀方法逐步形成,并通过 Joshua Bloch 写的《Effective Java》一书而大受欢迎。这种枚举模式方法需要编写一大堆模板式的代码,但能够让你做各种有趣而且功能强大的事情。而 Java 5 规范带来的众多令人振奋的创新之一就是让 enum 关键字再度复活,这是一种获得类型安全的枚举功能的简单方法,并且不需要编写繁琐的模板代码。此外,还提供了其他好处。

注意:C 语言风格的数字型的枚举类型还是在 Java 中时常出现。Sun API 中旧的部分就有很多。

不论枚举类型是用什么方法实现的,偶尔会需要将这种值持久化保存到数据库。虽然现在 Java 中已经有了标准的枚举类型,但 Hibernate 并没有提供内建的支持。所以我们来看看如何用 Hibernate 的 UserType 接口来实现枚举值的持久化。

假设我们想要能够指明曲目来自何处,例如录音带、Vinyl、VHS 影带、CD、广播、Internet 下载网站以及数字音频流。(我们需要区分从 Internet 网站下载,还是从像 Sirius 或 XM 这类卫星无线电服务下载,或者区分是从无线电台还是从电视台下载。这实在会让人发疯,不过,用来说明这个重要概念倒是很适合的。)

不考虑持久化,类型安全的枚举类看起来可能类似于例 6-1(已经对 JavaDoc 进行了压缩,以节约印刷空间。但是,如果从网站下载的话,格式是完整的)。

例 6-1:SourceMedia.java(第一个类型安全的枚举类)

package com.oreilly.hh;

/**

*This is a typesafe enumeration that identifies the media on which an

*item in our music database was obtained.

*/

public enum SourceMedia{

/**Music obtained from magnetic cassette tape.*/

CASSETTE("Audio Cassette Tape"),

/**Music obtained from a vinyl record.*/

VINYL("Vinyl Record"),

/**Music obtained from VHS tapes.*/

VHS("VHS Videocassette tape"),

/**Music obtained from a broadcast.*/

BROADCAST("Analog Broadcast"),

/**Music obtained from a digital compact disc.*/

CD("Compact Disc"),

/**Music obtained as an Internet download.*/

DOWNLOAD("Internet Download"),

/**Music obtained from a digital audio stream.*/

STREAM("Digital Audio Stream");

/**

*Stores the human-readable description of this instance, by which it is

*identified in the user interface.

*/

private final String description;

/**

*Enum constructors are always private since they can only be accessed

*through the enumeration mechanism.

*

*@param description human readable description of the source for the

*audio, by which it is presented in the user interface.

*/

private SourceMedia(String description){

this.description=description;

}

/**

*Return the description associated with this enumeration instance.

*

*@return the human-readable description by which this value is

*identified in the user interface.

**/

public String getDescription(){

return description;

}

}

当然,使用 Hibernate 的妙处就是我们不需要修改通常的 Java 类,就可以增加持久化支持。即使我们原来在设计这一 enum 类型时还没有考虑持久化,我们以后也是照原样使用这个类型。由于现在不必考虑使用过时的 PersistentEnum 接口,那么定义一个可持久化的枚举类型与定义其他任意枚举类型就没有什么区别了。

注意:使用 PersistentEnum 接口需要修改欲持久化的枚举类型的定义。与 PersistentEnum 接口不符合《Effective Java》提出的可持久化枚举模式或 Java 5 enum 关键字相比,这可能是废除 PersistentEnum 接口的更大原因。

那么如何告诉 Hibernate 持久化保存我们的枚举类型的值呢?接下来就介绍这些。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。