Я пытаюсь выяснить, как решить проблему, с которой я сталкиваюсь сейчас.
У меня есть три лица: Компания, Пользователь и Филиал. Таблица Affiliation - это таблица ссылок для отношений ManyToMany между сущностями Company и User и содержит дополнительные столбцы, которые мне нужно использовать.
На стороне компании у меня есть:
@JsonManagedReference
@OneToMany(mappedBy = "company", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Affiliation> affiliations = new HashSet<>();
На стороне пользователя у меня есть:
@JsonManagedReference(value="user")
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Affiliation> affiliations = new HashSet<>();
На стороне присоединения у меня есть:
@JsonBackReference
@ManyToOne(optional = false)
@JoinColumn(name = "company_id", referencedColumnName = "company_id")
private Company company;
@JsonBackReference(value = "user")
@ManyToOne(optional = false)
@JoinColumn(name = "user_id", referencedColumnName = "user_id")
private User user;
Класс репозитория:
public interface ICompanyRepository extends JpaRepository<Company, Long>
В классе реализации сервиса я выдаю. Компания является обновленным объектом компании.
Company updatedCompany = companyRepository.save(company);
И это дает мне
Причина: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'user_id' cannot be null.
Это говорит мне о том, что я должен как-то настроить User, но не уверен, как. Я могу получить доступ только к текущим данным пользователя, но у филиалов могут быть разные пользователи для одной и той же компании. Как я могу установить пользователя для каждой принадлежности?
Обновление:
Я добавил
Set<Affiliation> affiliations = company.getAffiliations();
Iterator<Affiliation> iterator = affiliations.iterator();
while (iterator.hasNext()) {
Affiliation existingAffiliation = iterator.next();
Long userId = existingAffiliation.getUserId();
User user = userRepository.findOne(userId);
existingAffiliation.setUser(user);
}
до
Company updatedCompany = companyRepository.save(company);
Это помогло решить проблему, но я не уверен, что это правильный способ, есть мысли?