У меня проблема с хранением сущностей JPA с вложенным общим родителем. Я пытался следовать рекомендациям по управлению данными Hibernate / Spring, но думаю, что я делаю что-то не так. Я много искал, но не могу найти строго связанного решения моей проблемы. Извините за большой вопрос и заранее благодарю всех, кто хочет помочь.
У меня есть следующие объекты:
Пользователь Объект
@Id
@Column(name = "id")
private String id;
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
name = "USERS_PORTFOLIOS",
joinColumns = @JoinColumn(name = "ID"),
inverseJoinColumns = @JoinColumn(name = "PORTFOLIO")
)
Set<Portfolio> portfolios = new HashSet<>();
// Skipped getters and setters
public void addPortfolio(Portfolio portfolio) {
this.portfolios.add(portfolio);
portfolio.getUsers().add(this);
}
public void removePortfolio(Portfolio portfolio) {
this.portfolios.remove(portfolio);
portfolio.getUsers().remove(this);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
return id != null && id.equals(((User) o).getId());
}
@Override
public int hashCode() {
return 31;
}
// Skipped constructors
Портфолио Сущность
@Id
@Column(name = "ID")
private String id;
@ManyToMany(mappedBy = "portfolios", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<User> users = new HashSet<>();
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
name = "PORTFOLIOS_COMPANIES",
joinColumns = @JoinColumn(name = "PORTFOLIO"),
inverseJoinColumns = @JoinColumn(name = "COMPANY")
)
Set<Company> companies = new HashSet<>();
// Skipped getters and setters
public void addCompany(Company company) {
this.companies.add(company);
company.getPortfolios().add(this);
}
// Remove the relationship between Portfolio and Company (not the company itself)
public void removeCompany(Company company) {
this.companies.remove(company);
company.getPortfolios().remove(this);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Portfolio)) return false;
return id != null && id.equals(((Portfolio) o).getId());
}
@Override
public int hashCode() {
return 31;
}
// Skipped constructors
Компания Сущность
@Id
@Column(name = "ID")
private String id;
@ManyToMany(mappedBy = "companies")
private Set<Portfolio> portfolios = new HashSet<>();
// Skipped getters and setters
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Company)) return false;
return id != null && id.equals(((Company) o).getId());
}
@Override
public int hashCode() {
return 31;
}
// Skipped constructors
Я хочу сохранить объект, заполненный следующей структурой:
USER
- PORTFOLIO_1
- COMPANY_1
- COMPANY_2
- PORTFOLIO_2
- COMPANY_2
- COMPANY_3
Как видите, COMPANY_2 одинаково для обоих портфелей ios. Когда я пытаюсь сохранить их с помощью userDaoRepository.save(user)
(метод из интерфейса CrudRepository), я получаю следующую ошибку:
javax.persistence.EntityNotFoundException: Unable to find com.adp.esi.shield.bean.repositories.Portfolio with id PORTFOLIO2_ID
Я предполагаю, что это потому, что COMPANY_2.portfol ios уже имеет ссылку на PORTFOLIO_2, которая имеет еще не был сохранен.
У вас есть идея, как правильно хранить этот объект? Большое спасибо!