2010-04-26 135 views
2

我想使用Hibernate 3.5将规范化Java模型映射到传统数据库模式。一个特定的表格将位于一对多关系中的外键编码为位数组列。休眠位阵列到实体映射

考虑表personclub描述人的隶属关系到俱乐部:

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相当简单。

+0

是你永远能算出这个? – rj2700 2016-12-15 04:26:25

回答

1

我从未遇到过这种情况,但我认为,你需要实现自定义UserCollectionType(见Hibernate的核心文档中章5.2.3. Custom value types),该UserCollectionType是一个扩展点可用于支持任何该死的收集和收集语义你喜欢

虽然我不确定它们有多好的注释支持(根据HHH-4417,您可能需要使用黑客)。在这里使用hbm.xml将是一个好主意。

一些更多的指针/讨论:

+0

不幸的是,在这种情况下,'UserCollectionType'似乎不是很有用。它的目的是让Hibernate使用从一个连接加载的一堆实体来填充你选择的“集合”。我的情况完全不同 - 我需要让Hibernate将字段中的值解释为实体的一组键,然后为这些实体创建代理,然后将这些代理添加到“集合”中。无论如何 - 谢谢你的建议! – teabot 2011-03-22 15:20:22

+0

您是否想过将数据库中的数据转换为临时表,然后从该简化聚合创建映射?你可能只能阅读,但只是一个想法。 – JamesC 2011-03-23 15:06:29