【问题标题】:How to add a HashMap<Object, String> in an entity class?如何在实体类中添加 HashMap<Object, String>?
【发布时间】:2016-01-17 07:09:09
【问题描述】:

我正在尝试创建一个示例报告卡应用程序,并希望在主题和学生成绩之间保留一个映射 这是我的记分卡课:

@Entity
public class ScoreCard {
    @NotNull @ElementCollection @ManyToMany(cascade=CascadeType.ALL)
    private Map<Subject, String> gradesForMainSubject = new HashMap<Subject, String>();
}

但是当我尝试保存数据时,我总是以

结尾
Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: gradesForMainSubject

主题本身是一个托管实体(由@Entity 注释)。关于如何继续前进的任何建议。

【问题讨论】:

标签: java hibernate spring-mvc jpa


【解决方案1】:

您不能同时将@ElementCollection 和@ManyToMany 用于集合字段。

如果您的集合的值是实体,那么您可以使用以下两种之一:@OneToMany 或 @ManyToMany

如果您的集合的值是非实体,那么您必须使用@ElementCollection。

在您的情况下,您的地图的值是不是实体的字符串。因此您需要使用@ElementCollection。删除 @ManyToMany 映射。无论您的映射键是否为实体,都应遵循此规则。

【讨论】:

  • 有没有办法级联保存操作。如果我在保存 ScoreCard 之前不保存 Subject,则会出错
  • Cascade 仅适用于实体关系映射(不适用于元素集合)并且仅适用于您的映射集合的值,但不适用于键。因此没有其他办法,但您必须有一个预先存在的主题实体,或者在保存记分卡之前先保留主题实体。
猜你喜欢
  • 1970-01-01
  • 2011-11-23
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
相关资源
最近更新 更多