2013-04-19 2 views
0

при тестировании моих объектов i получить ошибку внешний ключ без родителя; FKF7EC361BFEA0E826 table: DEVICE_DEVICE_PRESETS
Я тестирую, создавая объекты в моем конструкторе класса устройств . Ошибка возникает, когда я не создаю сохраненную предустановленную сущность и не добавляю ее в мой объект . если я создаю сохраненный предварительно установленный объект и добавлю его в объект моего устройства, код будет работать нормально.
(1) -The происходит ошибку при сохранении заданного объекта связан посредством явного столбца внешнего ключа, как показано ниже (stored_preset_num)
(2) - ошибка не происходит, когда объекты имеют одинаковые первичные ключи значений
Hibernate JPA foreign key no parent

Может кто-то, пожалуйста, помогите мне понять, почему, когда он связан только внешним ключом, он обеспечивает, чтобы существо присутствовало, а не просто соблюдало отношения? почему мне нужно создать хранимую предустановленного объект с (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; 


НАКОПИТЕЛЯМИ PRESET

@OneToOne 
private DevicePreset devicePreset; 

ответ

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; 

STORED PRESET

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

Спасибо, любая идея, почему я получаю эту ошибку с вышеуказанными изменениями? разбитое сопоставление столбцов для: devicePreset.storedPreset of: xxx.devices.xxx.entity.StoredPreset – user1518485

+0

Попробуйте только аннотацию JoinColumn, как в моем отредактированном ответе. В противном случае задайте другой вопрос, указав полное сопоставление и полную трассировку стека исключения, которое вы получите. –