可嵌入和ElementCollection嵌套



我有一个相当典型的场景,其中有一个主@Entity,并且他内部的一切都是可嵌入的(所以如果没有父实体,内部的一切就没有意义)。现在JPA 2.0阻止我在另一个@ElementCollection:中定义的@Embeddable中嵌套@ElementCollection

JSR-3172.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必须阻止我这么做?

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

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

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

至于为什么你不能这样做——如果你看看http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection然后你会看到,子(Edition)将只使用一个FK映射回所有者(Tournament.id),而没有自己的id列,理由是作为一个弱实体,它没有自己的标识,并且只能通过引用Tournament的标识来定义。

以Round为例,如果它也是一个弱实体,那么它应该通过引用版本的FK来定义——但我们已经说过它没有自己的ID,所以如果不向版本添加ID,你就无法在DB中映射它——在这一点上,它本身就是一个实体,而不是简单的@Embeddable。

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

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

相关内容

  • 没有找到相关文章

最新更新