当前位置: 首页 > 知识库问答 >
问题:

可嵌入和ElementCollection嵌套

闻人吕恭
2023-03-14

我有一个相当典型的场景,其中有一个main@实体,他内部的所有内容都是可嵌入的(因此,没有父实体,内部的所有内容都没有意义)。现在JPA 2.0阻止我在另一个@ElementCollection中定义的@Embeddeble中嵌套一个@ElementCollection:

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个答案

古明煦
2023-03-14

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

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

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

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

综上所述,如果这也是一个弱实体,那么它应该通过引用版本的FK来定义-但我们已经说过,它没有自己的ID,因此如果不向版本添加ID,就不能在DB中映射它-在这一点上,它本身就是一个实体,而不是简单的@可嵌入的。

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

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

 类似资料:
  • 在搜索了JPA文档和各种帖子后,我很困惑以下内容是否适用于JPA2。我刚开始学JPA所以如果我做了什么蠢事, 我的领域模型有一个“投资组合”,其中包含零个或多个“未平仓”。头寸由“工具”(JPA实体)和价格(双倍)组成。投资组合如下: OpenPosition嵌入式系统如下所示: 而该工具实体为: 当我试图使用这个时,模式被创建,我能够持久化投资组合,但是当我试图检索它们时,我在仪器类的hashC

  • 我遇到了一个问题,在我的JPA表中没有任何内容被持久化。据我所知,我想我理解了的基本思想。我猜出现问题的原因是,我在一个可嵌入的对象中有一个。 一个简单的例子: 有什么线索表明可能出了什么问题吗? 为了简洁起见,我将尽量使附加信息尽可能简短。 创建计算原因 创建计算历史记录 调试信息在计算历史#创建 HibernateDAO仓库 Hibernate生成的SQL 看起来HiberNate甚至没有生成

  • 我正在运行Hibernate 4.2.6。Final/JPA2,并尝试创建一个由@embedded对象组成的@ElementCollection列表,这些对象本身包含一个字符串的@ElementCollection列表。 但是,当尝试实例化EntityManager时,hibernate会抛出一个ContoptModificationException,我一点也不明白。 如果我注释掉我的

  • 问题内容: 我正在运行Hibernate 4.2.6.Final / JPA2,并尝试具有@Embeddable对象的@ElementCollection列表,这些对象本身包含String的@ElementCollection列表。 但是,hibernate在尝试实例化EntityManager时抛出ConcurrentModificationException,我根本不了解。 如果我注释掉in

  • 我想向实体类添加嵌入关系。 在我的数据库中,我有表蛋白质: 和表基准: 在基准测试中,字段目标是蛋白质表的外键 我已经从蛋白质表中找到了一个名为SupProtein的实体,它运行良好。 现在,我想向基准类添加一个嵌入关系。 这是我的基准课程: 在我的实体课程中,我添加了: 但当我尝试构建时,会出现以下错误: 我没有创建任何ORM. xml文件,在任何地方都找不到。我需要一个orm.xml文件来创建

  • 问题内容: 我想知道是否有可能在另一个Embeddable中包含Embeddable的ElementCollection? 这是我的供应商实体的示例,该实体具有可嵌入类型的地址列表: 这是我的可嵌入地址,其中包含可嵌入电话的列表 这是嵌入式电话的定义 我目前正在使用JPA 2 + Hibernate 3.6.x对此进行测试 在地址中使用嵌入式电话在我的测试中导致错误。这是最底层的部分调试消息: 删