gpt4 book ai didi

java - Hibernate 位数组到实体映射

转载 作者:行者123 更新时间:2023-11-30 11:59:06 25 4
gpt4 key购买 nike

我正在尝试使用 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 列告诉我们:

  • 没有人是 Cricket 的成员 --- 没有设置标志
  • Bob/Sue -> Tennis --- 位置 1 和 3 的旗帜已设置
  • Bob/Sue/Joe -> Cooking --- 设置位置 1、2 和 3 的标志
  • Sue -> Golf --- 位置 3 的标志已设置

现在,对于这个例子,可以使用一个连接表来代替,这将简化事情并避免许多潜在的问题——例如:最大范围的成员放置一个上限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 Core 文档中的 5.2.3. Custom value types 章), UserCollectionType 是一个扩展点,可用于支持您喜欢的任何该死的集合和集合语义

虽然我不确定注释对它们的支持有多好(根据 HHH-4417 ,您可能必须使用 hack)。在 IMO 中使用 hbm.xml 是个好主意。

一些更多的建议/讨论:

关于java - Hibernate 位数组到实体映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2714034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com