休眠位阵列到实体映射
我想使用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
列告诉我们:
- 没有一个是板球---没有标志设置
- 鲍勃/苏的成员 - >网球---在位置1和3标志设置
- 鲍勃/苏/乔 - >烹饪---在位置1,2和3标志设置
- 苏 - >高尔夫球---在第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
相当简单。
我从未遇到过这种情况,但我认为,你需要实现自定义UserCollectionType
(见Hibernate的核心文档中章5.2.3. Custom value types),该UserCollectionType
是一个扩展点可用于支持任何该死的收集和收集语义你喜欢。
虽然我不确定它们有多好的注释支持(根据HHH-4417,您可能需要使用黑客)。在这里使用hbm.xml
将是一个好主意。
一些更多的指针/讨论:
是你永远能算出这个? – rj2700 2016-12-15 04:26:25