2016-12-27 74 views
0

我是新来的ORM,并就死在了以下问题(简化这里的讨论):怎么做的Hibernate ORM映射为一个二维数组

我建模比赛,与竞争对手和学科。两者都有自己的实体类。竞争对手每次只参加一次竞赛,并获得一个分数。只要竞争对手还没有参加某个特定的学科,就没有得分。

数据模型:

一个简单的数据库设计将是一个成绩表的外键这两个竞争对手表和学科表。也就是说,我会建立两个一对多的关系,外加对外键的完整性约束 - 只要存在引用任何一个的分数,我就不能删除竞争对手或纪律。

但是,我该如何将这个二维数组(我的课程)映射到我的课堂上?我正在使用Java和Hibernate。 我目前的解决方案是将分数集合放入竞争对手实体类中,并且类似于Disciplines类。这为两个实体类中的每一个创建了与连接表的双向关系。这是做映射的推荐方式吗?

它确实从每个域类的角度映射关系,但是它错过了二维数组结构。我想要输出整个数组 - 例如在用户界面上 - 包含竞争者的行,纪律的列以及相应表格单元格中的分数。如上所述,从实体类中构建这样一个输出是很乏味的,需要(a)遍历竞争对手的集合,然后(b)查找相应的规则 - 或者反过来。

理想情况下,我希望有一个包含两个键(如Guava Table或嵌套哈希映射)的哈希映射。我想这种高级集合没有本地Hibernate映射。但也许有一个最佳实践如何使用自定义查询来实现它?

回答

0

但是,我该如何将这个二维数组(竞争者/学科)映射到我的类上?我正在使用Java和Hibernate。我目前的解决方案是将一组分数放入竞争对手实体类中,并且类似于Disciplines类。这为两个实体类中的每一个创建了与连接表的双向关系。这是做映射的推荐方式吗?

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

class Score { 
    @ManyToOne(optional=false) 
    Competitor competitor; 
    @ManyToOne(optional=false) 
    Discipline discipline; 
} 

这应该提供您需要的一切。您可能还需要Set<Score>Map<Discipline, Score>中的类Competitor(反之亦然),但您可能不需要它。该映射可能会使用@ManyToMany(mappedBy="competitor")@MapKey ......我没有使用它,只要我发现我并不真的需要它。

理想情况下,我想有一个哈希映射与两个键,如番石榴表,或嵌套哈希映射。

使用默认的@ManyToOne(fetch=EAGER),使用JOIN自动获取所需的竞争对手和学科。我很害怕,一个List是所有你能得到的,但一旦它迭代和填充番石榴Table很简单:

list.stream() 
.forEach(score -> table.put(score.competitor, score.discipline, score)); 

但不要忘记,实体是可变的,但在使用时必须不被突变作为关键。显然,你应该只取得你需要的实体,而不是过滤Table。但是,一旦你有了Table,你可以随意使用所有的操作; Hibernate不会再帮你了,但你不需要它(而且你不想再次击中数据库)。

相关问题