Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为2D数组执行Hibernate ORM映射_Java_Hibernate_Orm_Guava - Fatal编程技术网

Java 如何为2D数组执行Hibernate ORM映射

Java 如何为2D数组执行Hibernate ORM映射,java,hibernate,orm,guava,Java,Hibernate,Orm,Guava,我是ORM新手,在以下问题上陷入了困境(这里的讨论简化了): 我正在模拟一场比赛,有竞争对手和纪律。两者都有自己的实体类。参赛者在每一个学科中只比赛一次,并获得分数。只要参赛者还没有参加某一学科的比赛,就没有得分 数据模型: 简单的数据库设计是一个分数表,其中包含竞争对手表和纪律表的外键。也就是说,我会建立两个一对多的关系,加上外键上的完整性约束——我不能删除竞争对手或纪律,只要有引用其中任何一个的分数 但是我如何将这个2D数组(竞争对手/学科)映射到我的类中呢?我正在使用Java和Hibern

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

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

数据模型:

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

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

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

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

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

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

class Score {
    @ManyToOne(optional=false)
    Competitor competitor;
    @ManyToOne(optional=false)
    Discipline discipline;
}
这应该能提供你所需要的一切。您可能还需要一个
集合
甚至
地图
在类
竞争对手
中(在其他类中反之亦然),但您可能不需要它。映射可能会使用
@manytomy(mappedBy=“competitor”)
@MapKey
。。。我已经很久没用了,因为我发现我真的不需要它

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

使用默认的
@ManyToOne(fetch=EAGER)
,所需的竞争对手和规程将使用联接自动获取。恐怕,您只能得到一个
列表
,但迭代一次并填充番石榴
是很简单的:

list.stream()
.forEach(score -> table.put(score.competitor, score.discipline, score));
只是不要忘记,实体是可变的,但当用作键时,不能进行变异。显然,您应该只获取所需的实体,而不是过滤
。但是,一旦您拥有
,您就可以随意使用它的所有操作;Hibernate在这里不再帮你了,但是你不需要它(你也不想再碰到数据库)