Doctrine2 - 注释:渴望加载(join)与可空列(ManyToOne)

时间:2015-11-26 00:22:02

标签: doctrine-orm annotations entity nullable eager-loading

我有这个:

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

它为sql中的表tblCity创建了正确的JOIN,而TblCity实体插入了我的父实体 - 又名“Eager-Load”

伪结果:

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

但是,此 列需要可以为空

(如果遇到“丢失”的外国ID,则会抱怨丢失了TblCity的代理文件。)

所以它看起来像这样:

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

poff 出现了“Eager-Load”

生成的sql缺少表tblCity的JOIN,并且该列仅包含id而不包含TblCity的实体

伪结果:

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

我做错了什么?

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

的解决方案

1 个答案:

答案 0 :(得分:0)

原则@JoinColumn注释具有optiobal属性nullable,默认为true。有关详细信息,请参阅文档: 21.2.15. @JoinColumn

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

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

但默认情况下可以为空,所以你真的需要它......

我的猜测是,您的@Column注释会覆盖您案例中的整个@ManyToOne注释。这就是为什么您只获得idTblCity实体的原因。