我有这个:
/**
* @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或类似的东西,所以请不要涉及那个
的解决方案答案 0 :(得分:0)
原则@JoinColumn
注释具有optiobal属性nullable
,默认为true
。有关详细信息,请参阅文档: 21.2.15. @JoinColumn
因此,为联接列声明nullable
的正确方法是:
@JoinColumn(name="tblCity",referencedColumnName="Id", nullable=true)
但默认情况下可以为空,所以你不真的需要它......
我的猜测是,您的@Column
注释会覆盖您案例中的整个@ManyToOne
注释。这就是为什么您只获得id
和TblCity
实体的原因。