我对ORM很陌生,在以下问题上陷入困境(简化为这里的讨论):
我正在模拟一个比赛,与竞争对手和纪律。两者都有自己的实体类。竞争对手在每一个学科中完全一次竞争,并得到一个分数。只要竞争对手还没有在某一学科中竞争,就没有分数。
数据模型:
一个简单的DB设计将是一个带有竞争对手表和纪律表外键的分数表。也就是说,我会建立两个一对多的关系,再加上外键上的完整性约束--我不能删除一个竞争对手或一个纪律,只要有分数引用其中任何一个。
但是如何将这个2D数组(竞争对手/学科)映射到我的类中呢?我正在使用Java和Hibernate。我目前的解决方案是将分数集合放到竞争对手实体类中,对于纪律类也是如此。这将为两个实体类中的每个类创建一个带有联接表的双向关系。这是进行映射的推荐方法吗?
它确实从每个域类的角度映射了关系,但忽略了2D数组结构。我想要输出整个数组--例如,在UI上--列出竞争者的行、纪律的列以及相应的表格单元格中的分数。像刚才所描述的那样,从实体类构建这样一个输出是很繁琐的,需要(a)遍历竞争对手集合,然后(b)查找相应的规则--或者反过来。
理想情况下,我希望有一个带有两个键的散列映射,比如Guava表,或者嵌套的散列映射。我认为这种高级集合不存在原生Hibernate映射。但是,也许有一个最佳实践,如何使用自定义查询实现它?
发布于 2016-12-28 01:23:50
但是如何将这个2D数组(竞争对手/学科)映射到我的类中呢?我正在使用Java和Hibernate。我目前的解决方案是将分数集合放到竞争对手实体类中,对于纪律类也是如此。这将为两个实体类中的每个类创建一个带有联接表的双向关系。这是进行映射的推荐方法吗?
IIRC,隐式联接表不允许添加分数。即使是这样,我也不喜欢,因为分数实际上是主要的信息。所以我会选择一个明确的桌子。
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是很简单的:
list.stream()
.forEach(score -> table.put(score.competitor, score.discipline, score));请不要忘记,实体是可变的,但不能在用作键时进行变异。显然,您应该只获取所需的实体,而不是过滤Table。但是,一旦您拥有了Table,您就可以随意使用它的所有操作;Hibernate不再能在这里帮助您,但是您不需要它(而且您不想再次访问DB )。
https://stackoverflow.com/questions/41346646
复制相似问题