Дополнительные столбцы в отношениях JPA «многие ко многим» Spring Data с минимальными изменениями - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно внести изменения в модель проекта. В настоящее время у нас есть два класса с двунаправленным отношением «многие ко многим» (что подразумевается в таблице отношений), и теперь нам нужно добавить дополнительную информацию в отношения.

Мой вопрос таков: единственный способ сделать это - создать класс для отношения (например, создать этот класс с тем же именем таблицы отношений, которая уже существует)?

Я спрашиваю это, потому что, если нам нужно изменить вышеуказанные отношения в проекте, это изменение будет очень влиять, почти весь проект (серьезно).

Два класса, о которых я говорю, просто для ясности:

@Entity
public class Serie extends AbstractEntity {
   @ManyToMany
   private List<Disciplina> disciplinas;
}

@Entity
public class Disciplina extends AbstractEntity {
   @ManyToMany(mappedBy = "disciplinas")
   private List<Serie> series;
}

1 Ответ

0 голосов
/ 09 мая 2018

Как указано в комментариях, вам нужен объект объединения, но вам не нужно предоставлять его клиентам вашей доменной модели: выполнив что-то подобное ниже, вам нужно будет всего лишь изменить любой клиентский код, который напрямую изменяет коллекции, чтобы вызвать методы addXXX / removeXXX. Ни один клиентский код не знает только о сущности Join. Поэтому изменения в вашем Java-коде должны быть незначительными.

Что касается запросов, вам, очевидно, придется изменить их по мере необходимости.

Серия

@Entity
public class Serie extends AbstractEntity {

    @OneToMany(mappedBy = "serie")
    private List<SerieDisciplina> serieDisciplinas;

    public List<Disciplina> getDisciplinas(){
            //disciplinas extracted from serieDisciplinas 
            return Collections.unmodifiableList(...); 
    }

    public void addDisciplina(Disciplina disciplina){
        SerieDisciplina sd = new SerieDisciplina();
        sd.stSerie(this);
        sd.setDisciplina(disciplina);

        serieDesciplinas.add(sd);   
    }
}

Disciplina

@Entity
public class Disciplina extends AbstractEntity {

    @ManyToMany(mappedBy = "disciplina")
    private List<SerieDisciplina> serieDisciplinas;

    public List<Serie> getSeries(){
        //series extracted from serieDisciplinas
        return Collections.unmodifiableList(...); 
    }

    public void addSerie(Serie serie){
        SerieDisciplina sd = new SerieDisciplina();
        sd.stSerie(Serie);
        sd.setDisciplina(this);

        serieDesciplinas.add(sd);
    }
}

Присоединиться к организации

@Entity 
public class SerieDisciplina{
    @ManyToOne
    private Serie serie;

    @ManyToOne
    private Disciplina disciplina;

    //fields for the additional data about the relationship

    //getters and setters
}

В документах Hibernate рекомендуется избегать @ManyToMany, чтобы избежать подобных проблем. См. Обсуждение по адресу: Hibernate Best Practices: Избегание многих-ко-многим и «экзотических» отношений

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