Nested ManyToMany - EntityNotFoundException при сохранении потомков с общим родителем - PullRequest
0 голосов
/ 08 апреля 2020

У меня проблема с хранением сущностей 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, которая имеет еще не был сохранен.

У вас есть идея, как правильно хранить этот объект? Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...