0

在测试我的实体时,我得到错误外键没有父;FKF7EC361BFEA0E826 表:DEVICE_DEVICE_PRESETS
我正在通过在我的设备类构造函数中创建实体进行测试,当我没有创建存储的预设实体并将其添加到我的设备预设实体时会发生错误。如果我创建存储的预设实体并将其添加到我的设备实体中,则代码运行良好。
(1)-当存储的预设实体通过如下所示的显式外键列链接时会发生错误 (stored_preset_num)
(2)- 当实体共享相同的主键值时不会发生错误

有人可以帮我理解为什么当仅通过外键链接时它会强制实体存在而不是仅仅强制关系?为什么我需要使用 (1) 而不是 (2) 创建存储的预设实体

DEVICE

@OneToMany(cascade=CascadeType.ALL)
@JoinColumns({
    @JoinColumn(name="device_id",referencedColumnName="device_id"),
    @JoinColumn(name="node_id",referencedColumnName="node_id"),
    @JoinColumn(name="instance_id",referencedColumnName="instance_id")
})
@LazyCollection(LazyCollectionOption.FALSE)
   private List<DevicePreset> devicePresets;


DEVICE PRESETS
@ManyToOne
private Device device;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({   @JoinColumn(name="stored_preset_num",referencedColumnName=" stored_preset_num",insertable=false,updatable=false)
 })
private StoredPreset storedPreset;


存储的预设

@OneToOne
private DevicePreset devicePreset;
4

1 回答 1

0

我们重新来过吧。你的映射是错误的。在双向关联中,一侧是所有者侧,并且包含映射(或选择使用默认映射,不使用任何 JoinTable 或 JoinColun 注释),另一侧必须标记为另一侧的相反侧,使用mappedBy属性。所以映射应该是:

在双向一对多关联中,您别无选择:多方必须是所有者方。

所以映射应该是:

设备:

@OneToMany(cascade=CascadeType.ALL, mappedBy = "device")
@LazyCollection(LazyCollectionOption.FALSE)
private List<DevicePreset> devicePresets;

设备预设:

@ManyToOne
@JoinColumns({
    @JoinColumn(name="device_id",referencedColumnName="device_id"),
    @JoinColumn(name="node_id",referencedColumnName="node_id"),
    @JoinColumn(name="instance_id",referencedColumnName="instance_id")
})
private Device device;

@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="stored_preset_num",referencedColumnName=" stored_preset_num")
private StoredPreset storedPreset;

存储的预设

@OneToOne(mappedBy = "storedPreset")
private DevicePreset devicePreset;
于 2013-04-19T22:19:53.383 回答