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
实体。
我有这个:
/**
* @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
实体。