我有三个实体。设备,设备设置和设备状态。设备具有映射到DeviceSetting的非空OneToMany关系,称为设置。 DeviceSetting与DeviceState具有可为空的ManyToOne关系,称为状态。在数据库中,这由称为Device_State_id的Device_Setting表中的外键引用。由于有时不使用此字段,因此该外键有时可以为null。
为清楚起见...
Device.settings-> [DeviceSetting] .state-> DeviceState
我正在尝试在我的实体对象中表示它。但是,每当DeviceSetting具有指向DeviceState的空外键时,我在Device对象中都会得到一个空的设置列表。这是有问题的DeviceSetting的特定代码...
@DBObjectGet(table="Device_State", tableColumn="id", fieldForColumn="Device_State_id")
@ManyToOne(cascade = CascadeType.PERSIST, fetch=FetchType.LAZY, optional = true)
@JoinFetch(JoinFetchType.INNER)
@JoinColumn(columnDefinition="integer", name = "Device_State_id", nullable = true)
public DeviceState state;
正如您在这里看到的那样,我尝试使用批注中的可选字段和可为空字段来注意这种关系可能是空关系。我的期望是,该状态字段将在DeviceState对象中为null。但是,再次发生的是父设备对象的设置列表为空。
如果我将@Transient批注添加到DeviceState状态字段,则一切正常。但是很显然,如果外键不是null,那么我希望填写该状态对象。所以这不是解决方案。
我认为我误解了可选/空标志的使用?欢迎任何想法。
作为参考,我正在使用EclipseLink 2.7.2。