Временное исключение с использованием метода persist () JPA .. Сомнения в сохранении сущностей .. На какой стороне сохраняться?

Я впервые использую метод persist () в проекте. В JPA я использую Hibernate в качестве провайдера. Дело довольно простое. У меня 2 стола

  1. Компания - Company_id (PK, последовательность), G_Company_id (также будет уникальным)
  2. CP_Doc - Chronicle_id (PK), Company_id (от FK до Company_id выше))

Теперь у меня есть несколько CP_Docs для какой-то конкретной компании. Я успешно создал объекты (работаю с createNativeQuery, createQuery из JPA). Я также упомянул cascade = CASCADE.ALL для коллекции.

Для настойчивости я пишу следующий код.

Company company = new Company();
    company.setGCompanyId(7);
    for(/* Get all docs for a particular company having id = 7 */) {
        CP_Doc cpDoc = new CP_Doc();
        cpDoc.setChronicleId(/* some chronicle id from the loop */);    
        cpDoc.setCompany(company);
        entityManager.persist(cpDoc);
    }

Связь между таблицами заключается в том, что одна компания может иметь много cp_docs. Таким образом, таблица CP_Doc является таблицей-владельцем. Я попытался сохранить со стороны CP_Doc. Могу ли я также настоять на своем и со стороны юридического лица компании. Пожалуйста, помогите знатокам :)


person abhihello123    schedule 08.06.2012    source источник


Ответы (1)


Если я правильно понимаю, у вас уже есть компания в базе данных с ID 7, и вы пытаетесь добавить CPDoc к этой компании.

В этом случае нет смысла сохранять компанию, так как она уже существует. И создавать новую компанию тоже нет смысла, так как она уже существует. Вместо этого вам следует загрузить компанию из базы данных и присоединить компанию к новым документам CPDoc (и наоборот):

Company company = entityManager.find(Company.class, 7);
for(...) {
    CP_Doc cpDoc = new CP_Doc();
    cpDoc.setChronicleId(...);    
    cpDoc.setCompany(company);
    company.getCPDocs().add(cpDoc);
    entityManager.persist(cpDoc);
}
person JB Nizet    schedule 08.06.2012
comment
Привет @Nizet, в этой части я исправил небольшую ошибку company.setGCompanyId (7); Может быть 2 случая: 1) G_Company_ID уже существует (например, в этом случае существует 7). Вот часть company.getCPDocs (). Add (cpDoc); необходимо? Я предполагал, что это произойдет неявно, поскольку мы добавляем компанию в cpDoc в этом коде cpDoc.setCompany (company); 2) Когда G_Company_id не находится в базе данных - здесь мы должны создать новую компанию (), как код в моем вопросе? (После того, как find () завершился неудачно) - person abhihello123; 08.06.2012
comment
1. Это не обязательно, но если вам нужен непротиворечивый граф объектов, вы должны поддерживать его самостоятельно. Например, если вы продолжаете использовать компанию в одном и том же сеансе и надеетесь найти новый CPDoc в ее коллекции, его там не будет. Он будет там только тогда, когда вы перезагрузите компанию из базы данных в новом сеансе. 2. Да, если компании не существует, ее нужно создать и сохранить. - person JB Nizet; 08.06.2012
comment
+1 за четкое объяснение в ответе, а также комментарий :) - person abhihello123; 08.06.2012