Java Hibernate位数组到实体的映射

Java Hibernate位数组到实体的映射,java,hibernate,orm,usertype,Java,Hibernate,Orm,Usertype,我正在尝试使用Hibernate 3.5将规范化Java模型映射到遗留数据库模式。一个特定的表将一对多关系中的外键编码为位数组列 考虑描述人们与俱乐部关系的表person和club: person: .----.------. club: .----.---------.---------------------------. | id | name | | id | name | members | binary(members) |

我正在尝试使用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的标志
  • Sue->Golf---设置位置3处的旗帜
现在,对于这个例子,可以使用联接表来代替,这将简化问题并避免许多潜在的问题-例如:
成员的最大范围
人员
行数设置上限。然而,我仍然坚持使用这种模式,而且似乎在很久以前,就有一些因素支持使用位数组列

在我的Java域中,我希望使用如下实体对该模式进行建模:

class Person {
    private int id;
    private String name;
    ...
}

class Club {
    private Set<Person> members;
    private int id;
    private String name;
    ...
}
班级人员{
私有int-id;
私有字符串名称;
...
}
班级俱乐部{
私有集合成员;
私有int-id;
私有字符串名称;
...
}
我假设我必须使用
UserType
实现,但无法找到任何示例,其中用户类型所描述的项是对实体的引用(而不是文本字段值)或其组合。另外,我意识到,当加载< <代码>俱乐部>代码>实例时,我必须考虑< <代码>人>代码>实体是如何获取的。

有人能告诉我如何用Hibernate驯服这个遗留模式吗

更新


我最近不得不在一个遗留数据库中重新访问这种类型的映射。这一次,我们的
成员
表的等价物实际上是一个静态集,可以硬编码为
枚举
。通过这种简化,实现在位数组和一组枚举之间转换的Hibernate
UserType
非常简单。

我从未遇到过这种情况,但我认为您需要实现自定义的
UserCollectionType
(请参阅Hibernate核心文档中的章节),
UserCollectionType
是一个扩展点,可用于支持您喜欢的任何该死的集合和集合语义

不过,我不确定注释对它们的支持程度(根据,您可能需要使用hack)。在这里使用
hbm.xml
是一个好主意

还有一些建议/讨论:

  • (不同的情况,但可能会给你一个如何开始的想法)

不幸的是,
UserCollectionType
在这种情况下似乎没有那么有用。它的目的是允许Hibernate使用它从联接加载的一组实体填充您选择的
集合。我的情况完全不同-我需要Hibernate将字段中的值解释为实体的一组键,然后为这些实体创建代理,然后将这些代理添加到
集合中。无论如何,谢谢你的建议!您是否考虑过将数据库中的数据转换为临时表,然后从简化的聚合创建映射?你可能只能阅读…只是一个想法。你有没有想过这一点?