У меня есть объект Demographics, который содержит коллекцию объектов MedicalRecordsReceived:

//Demographics entity

@OneToMany(cascade = CascadeType.ALL, mappedBy = "demographics", fetch=FetchType.EAGER) частная коллекция medicalRecordsReceivedCollection;

А также

//MedicalRecordsReceived entity

@JoinColumn(name = "demographics_id", referencedColumnName = "iddemographics") @ManyToOne(необязательно = false, fetch=FetchType.EAGER) private Demographics demographics;

Когда я извлекаю сущность Demographics (в приложение Struts), коллекция работает нормально, и все поля в каждой сущности MedicalRecordsReceived отображаются нормально, за исключением идентификатора сущности Demographics, хранящегося в таблице MedicalRecordsReceived, которая, конечно, является внешним ключом. Та же проблема возникает при сохранении. Внешний ключ не может быть найден, и обновления не происходят.

Я понимаю, что у меня уже есть внешний ключ, когда я извлекаю объект «Демография», но удивляюсь, почему я не могу получить доступ через геттеры объекта «Демография». Думаю, я не совсем понимаю круговые отношения здесь...

Ник

0
Nick 21 Мар 2011 в 20:40

1 ответ

Вы не можете сопоставить один и тот же столбец базы данных с двумя разными полями. Столбец соединения demographics_id уже используется для сопоставления демографической ассоциации ManyToOne. Чтобы получить значение внешнего ключа, просто используйте medicalRecordsReceived.getDemographics().getId().

Чтобы сохранить новый экземпляр MedicalRecordsReceived, указывающий на экземпляр Demographics, вы должны инициализировать ассоциацию (и поддерживать обратную ассоциацию, чтобы иметь согласованную объектную модель):

MedicalRecordsReceived m = new MedicalRecordsReceived();
m.setDemographics(demographics);
demographics.getMedicalRecordsReceivedCollection().add(m);
// the cascade will take care of the persistence of m

Думайте с точки зрения объектов, а не с точки зрения столбцов.

0
JB Nizet 21 Мар 2011 в 20:50
Просто любопытно, как столбец demographics_id сопоставляется с двумя полями? Это поле существует в таблице MedicalRecordsRecieved и содержит первичный ключ объекта Demographics. На него ссылаются только непосредственно в отображении MedicalRecordsReceived. Сопоставление Demographics зависит от MedicalRecordsReceived для сопоставления. Спасибо.
 – 
Nick
21 Мар 2011 в 23:35