有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何为2D数组进行Hibernate ORM映射

我是ORM的新手,在以下问题上陷入了困境(这里的讨论简化了):

我正在模拟一场比赛,有竞争对手和纪律。两者都有自己的实体类。参赛者在每个学科中只比赛一次,并获得分数。只要参赛者尚未参加某一特定学科的比赛,就没有得分

数据模型:

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

但我如何将这个2D阵列(竞争对手/学科)映射到我的课程中呢?我正在使用Java和Hibernate。 我目前的解决方案是将一组分数放入Competitor实体类,同样地,也放入Districtions类。这将为两个实体类中的每一个创建一个双向连接表。这是推荐的映射方法吗

它确实从每个域类的角度映射了关系,但忽略了2D数组结构。我想输出整个数组——比如在UI上——包含竞争对手的行、学科的列,以及相应表格单元格中的分数。从前面描述的实体类中构建这样的输出非常繁琐,需要(a)迭代竞争对手集合,然后(b)查找相应的规程——或者反过来

理想情况下,我想要一个带有两个键的哈希映射,比如Guava表,或者一个嵌套的哈希映射。我认为这种高级集合没有本机Hibernate映射。但也许有一个最佳实践是如何使用自定义查询实现它


共 (1) 个答案

  1. # 1 楼答案

    But how do I map this 2D Array (competitors/disciplines) onto my classes? I am using Java and Hibernate. My current solution is to put a collection of scores into the Competitor entity class, and similarly for the Disciplines class. This creates a bidirectional relationship with a join table for each of the two entity classes. Is this the recommended way to do the mapping?

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

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

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

    Ideally, I would like to have a hash map with two keys, like the Guava Table, or a nested hash map.

    使用默认的@ManyToOne(fetch=EAGER),所需的竞争对手和规程将通过连接自动获取。恐怕,你只能得到一个List,但重复一次并填充一个番石榴Table是微不足道的:

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

    只是别忘了实体是可变的,但当用作键时不能发生突变。显然,您应该只获取所需的实体,而不是过滤Table。然而,一旦你有了Table,你可以随意使用它的所有操作;Hibernate在这里不会再帮你了,但你不需要它(你也不想再次点击数据库)