#java #spring #hibernate
#java #spring #переход в спящий режим
Вопрос:
Допустим, у меня есть следующие объекты и ассоциации:
Объект A:
@Entity
public class A {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true)
private List<B> b;
}
Объект B:
@Entity
public class B {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "a_id")
private A a;
@OneToMany(mappedBy = "b", cascade = CascadeType.ALL, orphanRemoval = true)
private List<C> c;
}
Объект C:
@Entity
public class C {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "b_id")
private B b;
}
Используя .findAll()
метод CrudRepository
объекта A
for A
, он вернет каждый объект B
со связанными с ним в списке. Кроме того, у каждого B
будут все связанные с ним C
объекты в списке.
Мой вопрос: если я в некоторых случаях хочу загружать только все A
‘ы с их B
‘s, но я не хочу, чтобы C
‘ы были в B
‘s, было бы это возможно? Могу ли я создать пользовательский запрос для этого, или есть другой способ? Я надеюсь, что понятно, чего я хочу достичь.
Комментарии:
1. Рассмотрим графики объектов.
2. Я попытаюсь посмотреть, смогу ли я заставить его работать с графиками объектов. Однако, поскольку
@OneToMany
по умолчанию этоfetch = FetchType.LAZY
, не должно ли это препятствовать загрузкеList<C> c;
объектаB
при загрузке объектаA
?3. Я искал ответ на этот вопрос как минимум 2 дня. Я также пробовал использовать
EntityGraphs
. Похоже, то, чего я хочу достичь здесь, просто невозможно. Думаю, мне просто придется согласиться с тем, что каждая ассоциация будет загружена.
Ответ №1:
Я думаю, что ваша проблема заключается в mappedBy
значениях на one
стороне OneToMany
отношений. mappedBy
значением должно быть имя переменной на другой стороне. Итак, в ваших случаях вы можете сделать это:
- В объекте A: измените
mappedBy = "citizen"
наmappedBy = "a"
- В объекте B: измените
mappedBy = "citizen"
наmappedBy = "b"
Я знаю, что объекты a, b, c — это всего лишь пример, но вы должны следовать приведенному выше шаблону при разработке отношений ваших моделей.
Комментарии:
1. Извините, как вы сказали, A, B и C — это всего лишь примеры. Я скопировал код из своего проекта и забыл изменить имена в
mappedBy
. Я правильно настроил это в своем проекте, так что это не является причиной проблемы.