【问题标题】:java.util.List is not mapped as an embeddablejava.util.List 未映射为可嵌入对象
【发布时间】:2013-12-08 14:04:12
【问题描述】:

我有一个包含 2 个类的设计模型:GameHighscore。它们之间的关系是:一个游戏可以有0个或多个高分。因此,我尝试将 Highscore 类定义为 @Embeddable 并在 Game 中编写:

@Embedded
private List<Highscore> highscores = new ArrayList<Highscore>();

问题是我从 Eclipse 收到以下错误:java.util.List is not mapped as an embeddable

有人知道可以做什么吗?

游戏:

@Entity
@Table(name="games")
public class Game {

    @Id
    private String name;

    @Column(name="highscore_table_size")
    private Integer highscoreTableSize;

    private String url;

    @Embedded
    private List<Highscore> highscores = new ArrayList<Highscore>();

    ...
}

高分:

@Embeddable
public class Highscore {

    private String playerName;

    private Date date;

    private int score;

    // getters and setter
}

编辑:我也遇到了来自 Eclipse 的 Table xyz cannot be resolved 错误,在寻找解决方案时,我找到了 this,并且关闭了 Build 的 JPA 验证器也解决了这篇文章。

【问题讨论】:

  • 可能是它成功了,但它不便携。文档说得很清楚:@Embedded defines a persistent field or property of an entity whose value is an instance of an embeddable class,不是一个集合。
  • 我改成了@ElementCollection。

标签: java jakarta-ee jpa java-ee-6


【解决方案1】:

您应该有 OneToMany 关联,而不是 Embedded。

Embedded 用于将对象的字段与其所属实体的字段存储在同一个表中。将它与 List 一起使用是没有意义的。

HighScore 必须是具有 ID 的实体,并且您必须在两个实体之间建立 OneToMany 关联。

【讨论】:

  • 是的,我知道我可以使Highscore 成为一个实体,但是 Postgres 具有 array 类型,我们希望通过在 Game 类中嵌入一个高分列表来在我们部门测试它.
【解决方案2】:

您应该为此使用@ElementCollection

文档摘录:

定义基本类型或可嵌入类的实例集合。 如果要通过 a 映射集合,则必须指定 收集表。

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 2013-08-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    相关资源
    最近更新 更多