Hibernate JPA外键没有父级

时间:2013-04-19 18:55:11

标签: hibernate jpa hibernate-mapping

在测试我的实体时,我收到错误 外键没有父母; 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;

1 个答案:

答案 0 :(得分:0)

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

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

所以映射应该是:

DEVICE:

@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;

STORED PRESET

@OneToOne(mappedBy = "storedPreset")
private DevicePreset devicePreset;