Java Hibernate位数组到实体的映射
我正在尝试使用Hibernate 3.5将规范化Java模型映射到遗留数据库模式。一个特定的表将一对多关系中的外键编码为位数组列 考虑描述人们与俱乐部关系的表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) |
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驯服这个遗留模式吗
更新
我最近不得不在一个遗留数据库中重新访问这种类型的映射。这一次,我们的
成员
表的等价物实际上是一个静态集,可以硬编码为枚举
。通过这种简化,实现在位数组和一组枚举之间转换的HibernateUserType
非常简单。我从未遇到过这种情况,但我认为您需要实现自定义的UserCollectionType
(请参阅Hibernate核心文档中的章节),UserCollectionType
是一个扩展点,可用于支持您喜欢的任何该死的集合和集合语义
不过,我不确定注释对它们的支持程度(根据,您可能需要使用hack)。在这里使用hbm.xml
是一个好主意
还有一些建议/讨论:
- (不同的情况,但可能会给你一个如何开始的想法)
UserCollectionType
在这种情况下似乎没有那么有用。它的目的是允许Hibernate使用它从联接加载的一组实体填充您选择的集合。我的情况完全不同-我需要Hibernate将字段中的值解释为实体的一组键,然后为这些实体创建代理,然后将这些代理添加到集合中。无论如何,谢谢你的建议!您是否考虑过将数据库中的数据转换为临时表,然后从简化的聚合创建映射?你可能只能阅读…只是一个想法。你有没有想过这一点?