可嵌入和元素集合嵌套

2022-09-04 01:59:13

我有一个相当典型的场景,其中有一个主要@Entity,他里面的一切都是可嵌入的(所以没有父母,里面的一切都没有意义)。现在,JPA 2.0阻止我将@ElementCollection嵌套在另一个@ElementCollection中定义的@Embeddable中:

JSR-317 2.6 可嵌入类和基本类型的集合 元素集合中包含的可嵌入类(包括另一个可嵌入类中的可嵌入类)不得包含元素集合,也不得包含与多对一或一对一关系以外的实体的关系

现在的问题是:这是为什么?一个简单的例子:

@Entity
public class Tournament {
    @Id
    Long id;

    @ElementCollection
    @CollectionTable
    private List<Edition>;
}

@Embeddable
public class Edition {

    @ElementCollection
    @CollectionTable
    private List<Round>
}

@Embeddable
public class Round {

    blabla;
}

这有什么问题?这只是一个例子,你可以将Round和Edition定义为实体并解决问题,但在我的情况下,出于多种原因,我需要强制要求,如果没有他的父母,非常嵌套的东西就没有意义。

为什么 JPA 2.0 必须阻止我这样做?


答案 1

您的情况违反了您粘贴的规范元素:

Edition 本身@Embeddable,并且包含 Round 的元素集合,因此:

包含在元素集合(Tournament.editions)中的可嵌入类(Edition)不得包含元素集合(Edition.rounds)。

至于为什么你不能这样做 - 如果你看一下 http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection 的例子,那么你会看到子(版本)将只用一个FK映射回所有者(Tournament.id),没有自己的ID列 - 理由是作为一个弱实体,它没有自己的ID, 并且仅通过引用锦标赛的 ID 进行定义。

以回合为例,如果这也是一个弱实体,那么它应该通过FK引用版本来定义 - 但是我们已经说过它没有自己的ID,所以你不能在不向版本添加ID的情况下在DB中映射它 - 此时它本身就是一个实体, 而不是简单地@Embeddable。

从下面的评论中看维基百科的例子 - http://en.wikipedia.org/wiki/Weak_entity - 弱实体的例子有OrderNumber,CustomerNumber等 - 只有当嵌入到另一个对象中时才有意义的东西。

您仍然可以拥有具有父映射(即版本上的锦标赛引用)和/或双向引用的实体。您可以在 Edition 上使用 @ManyToOne 注释上的 nullable=false 属性强制定义父级,从而强制执行模型的要求。


答案 2

推荐