Hibernate持久化枚举与自定义值类型的使用
立即解锁
发布时间: 2025-08-18 01:28:10 阅读量: 1 订阅数: 2 

### Hibernate 持久化枚举与自定义值类型的使用
#### 1. 持久化枚举的使用
在某些系统中,我们可能需要跟踪音乐曲目的源媒体信息。这里以一个点唱机系统为例,介绍如何使用持久化枚举来实现这一功能。
##### 1.1 具体操作步骤
- **添加属性到映射文档**:在 `Track.hbm.xml` 的类定义中添加一个新的属性标签,示例代码如下:
```xml
<property name="volume" type="short">
<meta attribute="field-description">How loud to play the track</meta>
</property>
<property name="sourceMedia" type="com.oreilly.hh.SourceMedia">
<meta attribute="field-description">Media on which track was obtained</meta>
<meta attribute="use-in-tostring">true</meta>
</property>
</class>
```
由于 `sourceMedia` 属性的类型指定了一个实现 `PersistentEnum` 接口的类,Hibernate 会使用其内置的枚举支持来持久化该属性。
- **更新 `Track` 类**:运行 `ant codegen` 来更新 `Track` 类,使其包含新属性。此时,完整的 `Track` 构造函数签名如下:
```java
public Track(String title, String filePath, Date playTime, Date added,
short volume, com.oreilly.hh.SourceMedia sourceMedia,
Set artists, Set comments) { ... }
```
- **修改 `CreateTest.java`**:在 `CreateTest.java` 中进行相应的更改,示例代码如下:
```java
Track track = new Track("Russian Trance",
"vol2/album610/track02.mp3",
Time.valueOf("00:03:30"), new Date(),
(short)0, SourceMedia.CD,
new HashSet(), new HashSet());
...
track = new Track("Video Killed the Radio Star",
"vol2/album611/track12.mp3",
Time.valueOf("00:03:49"), new Date(),
(short)0, SourceMedia.VHS,
new HashSet(), new HashSet());
```
除了 “The World '99” 来自流,“Test Tone 1” 的 `sourceMedia` 值为 `null` 外,其余标记为来自 CD。
- **重建数据库模式并创建示例数据**:运行 `ant schema` 来重建支持新属性的数据库模式,运行 `ant ctest` 来创建示例数据。
##### 1.2 操作结果
此时,`TRACK` 表中会包含一个整数列来存储 `sourceMedia` 属性。我们可以通过查看创建示例数据后表的内容来查看其值(最简单的方法是在 `ant db` 中运行查询)。
为了验证持久化到数据库的值是否正确,可以交叉检查分配给持久化枚举的代码。或者,通过稍微增强查询测试来打印检索到的曲目的该属性,以查看更有意义的信息版本。以下是 `QueryTest.java` 中的必要更改示例:
```java
// Print the tracks that will fit in seven minutes
List tracks = tracksNoLongerThan(Time.valueOf("00:07:00"),
session);
for (ListIterator iter = tracks.listIterator() ;
iter.hasNext() ; ) {
Track aTrack = (Track)iter.next();
String mediaInfo = "";
if (aTrack.getSourceMedia() != null) {
mediaInfo = ", from " +
aTrack.getSourceMedia().getDescription();
}
System.out.println("Track: \"" + aTrack.getTitle() + "\" " +
listArtistNames(aTrack.getArtists()) +
aTrack.getPlayTime() + mediaInfo);
```
运行 `ant qtest` 会得到如下输出示例:
```
qtest:
[java] Track: "Russian Trance" (PPK) 00:03:30, from Compact Disc
[java] Track: "Video Killed the Radio Star" (The Buggles) 00:03:49, from VHS Videocassette Tape
[java] Track: "Gravity's Angel" (Laurie Anderson) 00:06:06, from Compact Disc
[java] Track: "Adagio for Strings (Ferry Corsten Remix)" (Ferry Corsten, William Orbit, Samuel Barber) 00:06:35, from Compact Disc
[java] Track: "Test Tone 1" 00:00:10
[java] Comment: Pink noise to test equalization
```
如果在 `QueryTest` 中没有自定义格式化部分曲目的属性,而是依赖 `Track` 中的 `toString()` 方法,那么无需对 `QueryTest` 进行任何更改即可看到新信息。因为映射文档指定了 `sourceMedia` 属性应包含在 `toString()` 结果中。
为了使 `AlbumTest.java` 在对 `Track` 进行更改后能够编译和运行,可以简单地将 `addAlbumTrack()` 方法硬编码为假设所有内容都来自 CD,示例代码如下:
```java
/**
* Quick and dirty helper method to handle repetitive portion of creating
* album tracks. A real implementation would have much more flexibility.
*/
private static void addAlbumTrack(Album album, String title, String file,
Time length, Artist artist, int disc,
int positionOnDisc, Session session)
throws HibernateException
{
Track track = new Track(title, file, length, new Date(), (short)0,
SourceMedia.CD, new HashSet(), new HashSet())
```
0
0
复制全文
相关推荐










