【问题标题】:Doctrine2: OneToMany on mapped superclassDoctrine2:映射超类上的 OneToMany
【发布时间】:2012-10-18 22:05:55
【问题描述】:

我的数据库结构如下:

工作:

  • CTI工作
  • MappedSuperclassAbstractImageWork 扩展了 Work
  • 决赛桌 PhotoWork 扩展了 AbstractImageWork

评论:

WorkCommentWork 具有多对一关系:

@ManyToOne(targetEntity="Work", inversedBy="comments")

WorkWorkComment 具有 OneToMany 关系:

@OneToMany(targetEntity="WorkComment", mappedBy="work")

问题是 Doctrine 在更新架构时给了我这个错误:

[Doctrine\ORM\Mapping\MappingException]
It is illegal to put an inverse side one-to-many or many-to-many association on
mapped superclass 'Acme\...\AbstractImageWork#comments'.

我猜这与卡在 WorkPhotoWork 之间的 MappedSuperclass AbstractImageWork 有关,但我实际上并没有将此关系放在 MappedSuperclass 上,但放在 CTI 表上.. 那么为什么 Doctrine 会这样呢?

有什么想法吗?

【问题讨论】:

    标签: doctrine-orm relationship class-table-inheritance mappedsuperclass


    【解决方案1】:

    在某些情况下,当您从标记为 @ORM\MappedSuperclass 的类继承时遇到此类错误,请尝试将您的属性访问级别从 private 更改为 protected

    【讨论】:

    • 好吧,奇怪的是,这个解决方案对我不起作用。我遇到了(几乎完全相同的)同样的问题,我所有实体的属性都已经“受保护”了。我尝试将它们更改为“公开”,但无济于事。
    【解决方案2】:

    在其他情况下,当您在抽象上级类中声明 @ORM\Entity 而不是 @ORM\MappedSuperclass 时会发生这种情况

    【讨论】:

      【解决方案3】:

      映射的超类不能是实体,它不可查询,并且由映射的超类定义的持久关系必须是单向的(仅具有拥有方)。 这意味着在映射的超类上根本不可能进行一对多关联。 此外,只有当映射的超类目前仅在一个实体中使用时,多对多关联才是可能的.为了进一步支持继承,必须使用单表或联表继承特性。

      在这里查看:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/inheritance-mapping.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-12
        • 2013-12-18
        • 1970-01-01
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多