Загрузить объект без ассоциаций

#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 значением должно быть имя переменной на другой стороне. Итак, в ваших случаях вы можете сделать это:

  1. В объекте A: измените mappedBy = "citizen" на mappedBy = "a"
  2. В объекте B: измените mappedBy = "citizen" на mappedBy = "b"

Я знаю, что объекты a, b, c — это всего лишь пример, но вы должны следовать приведенному выше шаблону при разработке отношений ваших моделей.

Комментарии:

1. Извините, как вы сказали, A, B и C — это всего лишь примеры. Я скопировал код из своего проекта и забыл изменить имена в mappedBy . Я правильно настроил это в своем проекте, так что это не является причиной проблемы.