Спящий режим объединяет все поля

Я использую Spring Data + Hibernate и имею объект с несколькими полями @ManyToOne. Каждое поле извлекается спящим режимом с помощью отдельного запроса select.

Я уже пробовал @Fetch(value = FetchMode.JOIN), но бесполезно,

Пример:

 @Entity
 public class MyEntity{
    @Id
    private Long id;

    @JoinColumn(name = "A")
    @Fetch(value = FetchMode.JOIN)
    @ManyToOne
    private A a;

    @ManyToOne
    @Fetch(value = FetchMode.JOIN)
    @JoinColumn(name = "B")
    private B b;
}

Hibernate выполнит 3 обхода базы данных для MyEntity, A и B.

Есть ли способ получить мою сущность и все ее поля с помощью одного выбора, где A и B будут объединены >.?

Изменить:

Объекты A и B определены следующим образом:

@Entity
public class A{
    @Id
    Long id;
    String name;
}

Репозиторий выглядит так (Spring Data создает реализацию):

public interface MyEntityRepository extends CrudRepository<MyEntity , Long> {}

И код, который загружает объект, тоже довольно прост:

myEntityRepository.findAll();

Редактировать 2:

Я только что написал запрос QueryDSL, и для него был выполнен только 1 выбор. Я доволен по крайней мере этим.


person Monty Joe    schedule 05.11.2013    source источник
comment
FetchMode.JOIN должен попасть в одиночный выбор. Как определяются объекты A, B?   -  person kosa    schedule 05.11.2013
comment
Можете ли вы опубликовать код, который вы используете для загрузки объекта?   -  person Alan Hay    schedule 05.11.2013
comment
Интересный. Указание режима выборки даже не требуется. Значением по умолчанию для @ManyToOne является Eager, а режим FetchMode по умолчанию для Eager присоединен. В качестве эксперимента вы можете попробовать пометить @ManyToOne (необязательно = false)   -  person Alan Hay    schedule 06.11.2013
comment
Добавлен @ManyToOne (необязательно = false), результат тот же. Я все еще вижу выборочные запросы без каких-либо объединений для каждой сущности. В каждом предложении FROM ровно одна таблица.   -  person Monty Joe    schedule 06.11.2013
comment
Ну, вроде все в порядке, так что ничего другого предложить не могу. Если бы присоединение было абсолютно необходимо, то, я думаю, можно было бы переопределить методы findOne() и findAll(), либо аннотировав методы интерфейса с помощью @Query() и указав объединение выборки IN JPQL, либо предоставив конкретную реализацию репозитория и используя API критериев. Аналогичная проблема здесь с ответом, за который проголосовали 12 раз, хотя, похоже, он ничем не отличается от того, что вы сделали: stackoverflow.com/questions/2931936/. Что произойдет, если вы сделаете findOne()?   -  person Alan Hay    schedule 06.11.2013
comment
@AlanHay, спасибо за ответ. Если я делаю findOne(), на самом деле все извлекается за один выбор. После просмотра предоставленной вами ссылки я предполагаю, что это может быть проблема с получением коллекции данных Spring?   -  person Monty Joe    schedule 06.11.2013
comment
Spring Data просто делегирует Hibernate Session, так что, вероятно, это всего лишь одна из особенностей Hibernate.   -  person Alan Hay    schedule 06.11.2013