Embeddable和ElementCollection嵌套

Fra*_*sco 5 java hibernate jpa embeddable

我有一个相当典型的场景,其中有一个主要的@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;
}
Run Code Online (Sandbox Code Playgroud)

这有什么问题?这只是一个例子,您可以将Round和Edition定义为Entity并解决问题,但在我的情况下,出于多种原因,我需要强制执行非嵌套的东西没有他的父级是没有意义的.

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

ste*_*rey 14

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

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

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

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

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

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

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