首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对二维阵列进行Hibernate ORM映射

如何对二维阵列进行Hibernate ORM映射
EN

Stack Overflow用户
提问于 2016-12-27 14:04:36
回答 1查看 318关注 0票数 0

我对ORM很陌生,在以下问题上陷入困境(简化为这里的讨论):

我正在模拟一个比赛,与竞争对手和纪律。两者都有自己的实体类。竞争对手在每一个学科中完全一次竞争,并得到一个分数。只要竞争对手还没有在某一学科中竞争,就没有分数。

数据模型:

一个简单的DB设计将是一个带有竞争对手表和纪律表外键的分数表。也就是说,我会建立两个一对多的关系,再加上外键上的完整性约束--我不能删除一个竞争对手或一个纪律,只要有分数引用其中任何一个。

但是如何将这个2D数组(竞争对手/学科)映射到我的类中呢?我正在使用Java和Hibernate。我目前的解决方案是将分数集合放到竞争对手实体类中,对于纪律类也是如此。这将为两个实体类中的每个类创建一个带有联接表的双向关系。这是进行映射的推荐方法吗?

它确实从每个域类的角度映射了关系,但忽略了2D数组结构。我想要输出整个数组--例如,在UI上--列出竞争者的行、纪律的列以及相应的表格单元格中的分数。像刚才所描述的那样,从实体类构建这样一个输出是很繁琐的,需要(a)遍历竞争对手集合,然后(b)查找相应的规则--或者反过来。

理想情况下,我希望有一个带有两个键的散列映射,比如Guava表,或者嵌套的散列映射。我认为这种高级集合不存在原生Hibernate映射。但是,也许有一个最佳实践,如何使用自定义查询实现它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-28 01:23:50

但是如何将这个2D数组(竞争对手/学科)映射到我的类中呢?我正在使用Java和Hibernate。我目前的解决方案是将分数集合放到竞争对手实体类中,对于纪律类也是如此。这将为两个实体类中的每个类创建一个带有联接表的双向关系。这是进行映射的推荐方法吗?

IIRC,隐式联接表不允许添加分数。即使是这样,我也不喜欢,因为分数实际上是主要的信息。所以我会选择一个明确的桌子。

代码语言:javascript
复制
class Score {
    @ManyToOne(optional=false)
    Competitor competitor;
    @ManyToOne(optional=false)
    Discipline discipline;
}

这应该能提供你所需要的一切。您还可能需要类Set<Score>,甚至是Map<Discipline, Score> (反之亦然),但您可能不需要它。映射可能会使用@ManyToMany(mappedBy="competitor")@MapKey..。我很久没有使用它了,因为我发现我并不需要它。

理想情况下,我希望有一个带有两个键的散列映射,比如Guava表,或者嵌套的散列映射。

使用默认的@ManyToOne(fetch=EAGER),所需的竞争对手和规则将通过连接自动获取。恐怕您只能得到一个List,但是迭代它一次并填充一个Table是很简单的:

代码语言:javascript
复制
list.stream()
.forEach(score -> table.put(score.competitor, score.discipline, score));

请不要忘记,实体是可变的,但不能在用作键时进行变异。显然,您应该只获取所需的实体,而不是过滤Table。但是,一旦您拥有了Table,您就可以随意使用它的所有操作;Hibernate不再能在这里帮助您,但是您不需要它(而且您不想再次访问DB )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41346646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档