gpt4 book ai didi

java - 如何使用 JPA 保存 Map

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:15 26 4
gpt4 key购买 nike

我正在迁移一些代码,这些代码具有两个实体(Progress 和 PerformanceRating),这两个实体之间存在多对多关系。每个 PerformanceRating 都有多个 Progress,每个 Progress 类型可以分配给多个 PerformanceRatings。此外,每个 PerformanceRating->Progress 都有一个与进度相关的附加“数量”值。

当前 PerformanceRating 对象包含一个映射,表示分配给 PerformanceRating 对象的每个进度类型的进度“量”。

编码如下:

@Entity
class PerformanceRating{
....
....
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "performance_rating_progress_reward", joinColumns = { @JoinColumn(name = "id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "amount", nullable = false, updatable = false) })
public Map<Progress, Integer> getRewardAmountByProgressMap() {
return this.rewardAmountByProgressMap;
}

但是,当我启动 JBoss(使用 hibernate 3.6/JTA/JPA)时,出现以下错误:

Use of @OneToMany or @ManyToMany targeting an unmapped class: fwl.domain.model.PerformanceRating.rewardAmountByProgressMap[java.lang.Integer]

我找到了一个类似的线程(Persist a Map<Integer,Float> with JPA),但那个线程似乎处理非实体类型。在像我这样的情况下,我正在寻找实体/值类型映射,正确的语法是什么?

有没有办法在 Hibernate/JPA2 中做到这一点?

谢谢,

埃里克

最佳答案

你得到的错误:

Use of @OneToMany or @ManyToMany targeting an unmapped class: fwl.domain.model.PerformanceRating.rewardAmountByProgressMap[java.lang.Integer]

与这样一个事实有关,即对于像 @OneToMany@ManyToMany 这样的注释,你说声明类 (PerformanceRating) 在很多-与 map 的Integer 的多对多关系,这是愚蠢的

你的 map 的值应该是一个实体,它的键应该是你可以用来识别你的 map 包含的那些实体之一的id(实际上,键必须是唯一的,我认为,它不必是一个实际的 ID)。


我真的不知道你的表是什么样子,但如果你的 PerformanceRating(为方便起见,我们称它为 Rating)看起来像这样:

rating
============
id int(11) PK

和你的 Progress 表是这样的:

progress
============
id int(11) PK
amount int(11)

用这样的表格连接这些:

progress_has_rating
============
progress_id int(11) PK
rating_id int(11) PK

然后您可以通过以下方式映射它们:

@Entity @Table class Rating {
@Id long id;
@ManyToMany(targetEntity = Progress.class,
cascade = CascadeType.ALL,
fetch = FetchType.EAGER)
@JoinTable(name = "progress_has_rating",
joinColumns = {@JoinColumn(name = "rating_id",
referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "progress_id",
referencedColumnName = "id")})
Set<Progress> progresses;
}

@Entity class Progress {
@Id long id;
@Basic long amount;
}

(我很可能在 @JoinColumn 注释中调换了实际有效的列名称;我总是调换它们。)

(编辑:是的,我已将它们切换为已修复。)


如果您的 amount 属性在您的连接表中,那么您还需要为它创建一个实体类。我认为不可能绕过那个

如果您真的想使用 map ,那么 Hibernate 可以管理它。查看Collection mapping关于如何映射 map 的部分(特别是第 7.2.2.2 节)。不过, map 中的值仍需要是某种实体。

关于java - 如何使用 JPA 保存 Map<Entity, Integer>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7578231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com