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 如何保存地图<;实体,整数>;和JPA一起?_Java_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

Java 如何保存地图<;实体,整数>;和JPA一起?

Java 如何保存地图<;实体,整数>;和JPA一起?,java,hibernate,jpa,jpa-2.0,Java,Hibernate,Jpa,Jpa 2.0,我正在迁移一些代码,这些代码有两个实体(Progress和PerformanceOperationing),它们通过多对多关系相互关联。每个绩效操作都有多个进度,每个进度类型可以分配给多个绩效操作。此外,每个PerformanceOperationing->Progress都有一个与进度相关的附加“金额”值 当前Performance对象包含一个映射,表示分配给Performance对象的每个进度类型的进度“量” 其编码如下: @Entity class PerformanceRating{ .

我正在迁移一些代码,这些代码有两个实体(Progress和PerformanceOperationing),它们通过多对多关系相互关联。每个绩效操作都有多个进度,每个进度类型可以分配给多个绩效操作。此外,每个PerformanceOperationing->Progress都有一个与进度相关的附加“金额”值

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

其编码如下:

@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;
}
我发现了一个类似的线程(),但该线程似乎处理非实体类型。在我的例子中,我正在寻找实体/值类型映射,正确的语法是什么

在Hibernate/JPA2中有这样做的方法吗

谢谢

Eric

您得到的错误:

使用@OneToMany或@ManyToMany定位未映射的类:fwl.domain.model.PerformanceOperationing.rewardAmountByProgressMap[java.lang.Integer]

涉及到这样一个事实,即对于像
@OneToMany
@ManyToMany
这样的注释,您说声明类(
performancing
)与地图的值存在多对多关系,
Integer
,这很愚蠢

地图的值应该是一个实体,它的键应该是标识地图包含的实体之一的id(实际上,键必须是唯一的,我认为,它不需要是实际的id)


我真的不知道您的表是什么样子,但是如果您的
性能操作
(为了方便起见,我们称之为
评级
)是这样的:

rating
============
id               int(11) PK
progress
============
id               int(11) PK
amount           int(11)
progress_has_rating
============
progress_id      int(11) PK
rating_id        int(11) PK
您的
进度表如下所示:

rating
============
id               int(11) PK
progress
============
id               int(11) PK
amount           int(11)
progress_has_rating
============
progress_id      int(11) PK
rating_id        int(11) PK
通过一个表格连接如下:

rating
============
id               int(11) PK
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;
}
@Entity@表类评级{
@Id长Id;
@ManyToMany(targetEntity=Progress.class,
cascade=CascadeType.ALL,
fetch=FetchType.EAGER)
@JoinTable(name=“progress\u具有\u评级”,
joinColumns={@JoinColumn(name=“rating_id”,
referencedColumnName=“id”)},
inverseJoinColumns={@JoinColumn(name=“progress\u id”,
referencedColumnName=“id”)})
设定进度;
}
@实体类进度{
@Id长Id;
@基本长期金额;
}
(很可能我在
@JoinColumn
注释中调高了实际工作的列名;我总是调高它们。)

(编辑:是的,我已将其切换到固定状态。)


如果您的
amount
属性在联接表中,那么您还需要为此创建一个实体类。我认为这是不可能的


如果您真的想使用映射,那么Hibernate可以管理它。有关如何绘制地图,请参见章节(特别是第7.2.2.2节)。不过,地图中的值需要是某种实体。

JPA不适合地图的情况。JDO是唯一一个处理这种情况的持久性规范。感谢您的提示。我不知道JDO,所以我花了一点时间阅读它,我发现它非常有趣。如果我在6个月前知道这一点,我会推动JDO实现而不是JPA实现;听起来它有很多好处。在未来的项目中,我们一定会记住这一点。感谢您的澄清。这有点证实了我所担心的。我对代码或表的结构也不满意,但我不负责清理,因为这将是一项严肃的任务。我只是试图在不改变功能或strutre的情况下进行清理,如果有可能的话,那么当前的映射显然被破坏了。不幸的是,我需要的不仅仅是一套。“amount”字段实际上存储在联接表中,而不是进度表中。这很不幸,但没有先例。:)但是,您确实无法回避为创建实体类来表示联接表的问题。看看这些链接,也许它们能在某种程度上帮助你。干杯