Doctrine2 - 注释:急切加载(连接)与可空列(ManyToOne)

Doctrine2 - Annotations: eager load (join) vs. nullable column (ManyToOne)

我有这个:

/**
 * @ManyToOne(targetEntity="TblCity",fetch="EAGER",cascade={"persist"})
 * @JoinColumn(name="tblCity",referencedColumnName="Id")
 */

并且它在 sql 中为 table tblCity 创建了正确的 JOIN,并且 TblCity 实体插入了我的父实体 - 又名 "Eager-Load"

伪结果:

PersonEntity: {
    Id: 1
    ...
    CityEntity: {
        Id: 1
        ...
    }
}

但是,此 列需要可以为空

(如果遇到 "missing" 外国 ID,它会抱怨缺少 TblCity 的代理文件)。

所以它必须看起来像这样:

/**
 * @Column(nullable=true)
 * @ManyToOne(targetEntity="TblCity",fetch="EAGER",cascade={"persist"})
 * @JoinColumn(name="tblCity",referencedColumnName="Id")
 */

poff "Eager-Load"

生成的 sql 缺少 table tblCity 的 JOIN,并且该列仅包含 ID 而不是 TblCity[=14= 的实体]

伪结果:

PersonEntity: {
    Id: 1
    ...
    CityEntity: 1 (as integer)
}

我做错了什么?

PS:我不能使用 createQuery 或类似的东西,所以请不要涉及涉及

的解决方案

学说 @JoinColumn 注释有一个可选属性 nullable,默认为 true。在文档中阅读更多相关信息:21.2.15. @JoinColumn

因此,为连接列声明 nullable 的正确方法是:

@JoinColumn(name="tblCity",referencedColumnName="Id", nullable=true)

但默认情况下 nullable 为真,因此您并不真的需要它...

我的猜测是,您的 @Column 注释会否决您案例中的整个 @ManyToOne 注释。这就是为什么你只得到一个 id 而没有 TblCity 实体。