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 定义为 Entity 并解决问题,但在我的情况下,出于多种原因,我需要强制执行非常嵌套的东西没有他的父级是没有意义的。

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

4

1 回答 1

19

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

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

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

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

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

从下面的评论中查看 Wikipedia 示例 - http://en.wikipedia.org/wiki/Weak_entity - 弱实体的示例有 OrderNumber、CustomerNumber 等 - 只有在嵌入另一个对象时才有意义。

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

于 2014-03-02T11:29:54.530 回答