从父实体映射中将可嵌入字段设置为主键 - Doctrine2

Posted

技术标签:

【中文标题】从父实体映射中将可嵌入字段设置为主键 - Doctrine2【英文标题】:Set Embeddable Field as Primary Key from Parent Entity Mapping - Doctrine2 【发布时间】:2014-10-02 22:42:03 【问题描述】:

TLDR; Doctrine2:我需要知道是否可以将 Embeddable 中的字段从父实体(或 MappedSuperclass')映射中创建为主键。我已经知道如何从 Embeddable 的映射中设置主键,但这并不理想(参见“长版本”)。

http://doctrine-orm.readthedocs.org/en/latest/tutorials/embeddables.html

长版; 我正在尝试使用 Doctrine2 Embeddables 为我的实体创建身份值对象。

这是我的问题...

我在一个实体 (MyEntity) 中有两个不同的嵌入对象(MyEntityId 和 OtherEntityId)。

我希望 MyEntityId 中的一个字段成为 MyEntity 的主键。

由于我在同一个实体中有两个可嵌入标识,因此我想在实体映射文件中定义主键字段,而不是可嵌入映射。

如果我从可嵌入对象中定义主键,当我想对 OtherEntityId 执行相同操作时会遇到问题(因为我在其他地方使用它)。

在 MyEntityId 和 OtherEntityId 中映射主键会导致 MyEntity 具有我不想要的复合键。

这是我目前的映射...

MyEntity:
    embedded:
        MyEntityId:
            class: 'MyEntityId'
            columnPrefix: false
        OtherEntityId:
            class: 'OtherEntityId'
            columnPrefix: false

MyEntityId:
    type: 'embeddable'
        id: 
            id:
                column: 'MyEntityId'
                type: 'string'

OtherEntityId:
    type: 'embeddable'
        id: 
            id:
                column: 'OtherEntityId'
                type: 'string'

解决方案?

创建两个单独的 Embeddables 来表示相同的 Id 值对象(不是很干也不太复杂)

从实体映射 Embeddable 的主键字段(这可能吗?我在文档中的任何地方都找不到)

【问题讨论】:

您找到解决方案了吗?我也有同样的问题…… 仍然没有解决方案。我遇到了同样的问题。最好从映射它的实体中指向 Embedded 对象的列 id,以使 Embedded 字段成为 DB 表中主键的一部分。 【参考方案1】:

根据 Doctrine 2 文档:

Embeddables 只能包含带有基本@Column 映射的属性。 http://doctrine-orm.readthedocs.org/en/latest/tutorials/embeddables.html

我认为您无法将 @id 属性指定为可嵌入的,只是基本的普通字段,因为它们是某种容器而不是实体。

【讨论】:

正如我在问题中所述,我可以在嵌入对象上指定 @id 属性。你的回答是针对我没有问过的问题。

以上是关于从父实体映射中将可嵌入字段设置为主键 - Doctrine2的主要内容,如果未能解决你的问题,请参考以下文章

可嵌入类的映射实体

@Results用法总结

dljd_(057-058)_hibernate_关联关系映射-什么是关联关系

Hibernate5--课程笔记5

在 Spring Boot jpa 中将多个外键映射到同一个主键

2个mysql表映射为1个扩展实体