【发布时间】:2010-04-26 14:00:30
【问题描述】:
我正在尝试使用 Hibernate 3.5 将规范化的 Java 模型映射到旧数据库模式。一个特定的表将一对多关系中的外键编码为位数组列。
考虑表格person 和club,它们描述了人们与俱乐部的关系:
person: .----.------. club: .----.---------.---------------------------.
| id | name | | id | name | members | binary(members) |
|----+------| |----+---------|---------+-----------------|
| 1 | Bob | | 10 | Cricket | 0 | 000 |
| 2 | Joe | | 11 | Tennis | 5 | 101 |
| 3 | Sue | | 12 | Cooking | 7 | 111 |
'----'------' | 13 | Golf | 3 | 100 |
'----'---------'---------'-----------------'
所以希望很明显person.id被用作位数组club.members中的位索引:
.---.---.---.
| S | J | B |
| u | o | o |
| e | e | b |
|---+---+---|
| 1 | 0 | 1 |
'---'---'---'
在此示例中,members 列告诉我们:
- 没有人是 Cricket 的成员 --- 没有设置标志
- Bob/Sue -> 网球 --- 位置 1 和 3 的标志已设置
- Bob/Sue/Joe -> 烹饪 --- 位置 1、2 和 3 的标志已设置
- Sue -> Golf --- 位置 3 的标志已设置
现在,对于此示例,可以使用连接表来代替,这将简化问题并避免许多潜在问题 - 例如:members 的最大范围设置了people 行数的上限。但是,我被这个架构卡住了,而且似乎有一些因素支持使用位数组列。
在我的 Java 域中,我想用这样的实体来建模这个模式:
class Person {
private int id;
private String name;
...
}
class Club {
private Set<Person> members;
private int id;
private String name;
...
}
我假设我必须使用 UserType 实现,但找不到任何示例,其中用户类型描述的项目是对实体的引用 - 不是文字字段值 - 或其组合。此外,我知道我必须考虑在加载 club 实例时如何获取 person 实体。
谁能告诉我如何使用 Hibernate 驯服这个遗留架构?
更新
我最近不得不在旧数据库中重新审视这种类型的映射。这一次很明显,我们等效的members 表实际上是一个静态集,可以硬编码为Enum。通过这种简化,实现在位数组和一组枚举之间转换的 Hibernate UserType 相当简单。
【问题讨论】:
-
你有没有想过这个问题?
标签: java hibernate orm usertype