@k_f_i

Как правильно устанавливать связи в Java Spring между Entity?

Добрый день, делаю свой первый проект (финансовое приложение) в котором если следующие Entity:
User - тут все понятно
Chapter - крупный раздел, например "Жилье", которое содержит категории.
Category - соответственно сами категории, продолжая пример - "Свет", "Газ", "Вода".
Operation - сама операция на какую то сумму.
Вопрос, как правильно установить связи между ними, на данный момент у меня сделано так:

public class User {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    private List<Chapter> chapters;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    private List<Category> categories;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    private List<Operation> operations;
}

public class Chapter {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "chapter")
    private List<Category> categories;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "chapter")
    private List<Operation> operations;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

public class Category {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "category")
    private List<Operation> operations;
    @ManyToOne
    @JoinColumn(name = "chapter_id")
    private Chapter chapter;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

public class Operation {
    @ManyToOne
    @JoinColumn(name = "chapter_id")
    private Chapter chapter;
    @ManyToOne
    @JoinColumn(name = "category_id")
    private Category category;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}


Помимо рекурсии с которой в целом понятно как бороться, возникает ряд других проблем.
Например, при сохранение Operation, надо получить объект User, Chapter и Category, а это дополнительные затраты
ресурсов, хотя достаточно было бы только id этих объектов.
В инете нашел инфу с какими то банальными примерами.
Если знаете хорошую статью или видео, где разбираются сложные структуры, скиньте пожалуйста.
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
С одной стороны, использование ORM фреймворков упрощает разработку. Но я замечал, что некоторые разработчики работая в рамках ORM напрочь не изучают SQL и конечно же это плохо.
Hibernate хорош с тем, что упрощает разработку, но иногда его необдуманное применение может привести к проблемам. Например, каскады. Честно говоря, работать с jdbc template, тоже не то. Я бы выбрал бы jooq.
Кстати, если у вас есть операция с балансом, то надеюсь, что вы используете BigDecimal, а не double или float. Если что погуглите Bigdecimal vs double high precision

Chapter - крупный раздел, например "Жилье", которое содержит категории.
Category - соответственно сами категории, продолжая пример - "Свет", "Газ", "Вода".

В терминологии ВП, chapter - taxonomy, а категория остается как есть.

Я бы рекомендовал прочитать статьи в блоге Влада Михалки. https://vladmihalcea.com/
А еще у него в гите есть примеры на relation-ы. Вдруг, тоже будет полезно

https://github.com/vladmihalcea/high-performance-j...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы