Hibernate Внешний ключ JPA без родителя

при тестировании моих объектов я получаю ошибку внешнего ключа без родителя; Таблица 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;

person user1518485    schedule 19.04.2013    source источник


Ответы (1)


Это снова мы. Ваше отображение неверно. В двунаправленной ассоциации одна сторона является стороной владельца и содержит сопоставление (или выбирает использование сопоставления по умолчанию без использования какой-либо аннотации 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;
person JB Nizet    schedule 19.04.2013
comment
Спасибо, есть идеи, почему я получаю эту ошибку с вышеуказанными изменениями? неработающее сопоставление столбцов для: devicePreset.storedPreset of: xxx.devices.xxx.entity.StoredPreset - person user1518485; 20.04.2013
comment
Попробуйте использовать только аннотацию JoinColumn, как в моем отредактированном ответе. В противном случае задайте другой вопрос, указав полное сопоставление и полную трассировку стека полученного вами исключения. - person JB Nizet; 20.04.2013