2015-02-15 3 views
0

Я использую Spring Data JPA и имею много отношений от Child to Parent Class, используя спящий режим. Я пишу API поиска, который будет искать в дочерней таблице, используя некоторые столбцы дочерних таблиц, и возвращать список дочерних объектов вместе с некоторыми данными из класса Parent для каждого дочернего объекта. Я делаю по умолчанию нетерпевую выборку для отношений «многие к одному». Проблема, с которой я столкнулся, позволяет сказать, что после поиска дочерней таблицы возвращается 10 записей, а hibernate выполняет 10 различных запросов выбора в родительском классе, чтобы получить родительский объект для каждого дочернего объекта. Есть ли способ оптимизировать это? Существует решение, заданное аналогичной проблеме here, но это для одного-многих случаев. Я также не мог найти ничего полезного в этом отношении на веб-сайте. Есть идеи ?Весенние данные JPA избегают множественного выбора во многих отношениях.

+0

Я предполагаю: вы забираете детей. Детский объект определяется родителем в классе. Родитель определяется с нетерпением. Учитывая, что: Вы говорите, что Hibernate создает несколько операторов SELECT - по одному на каждого загруженного ребенка - для извлечения родителя? Я проверил бы это, если бы я был вами ... Если это правда, я бы просто сконфигурировал кеш для спящего режима. Это не нужно. Я буду копать в минуту для документации. https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/performance.html#performance-cache – Mike

ответ

0

как вы не показали каких-либо кодов в вопросе, это немного трудно решить, но я думаю, что если вы укажете join column (@JoinColumn аннотацию) и использовать @OneToMany аннотацию в parent класса (с указанием fetch типа) и @ManyToOne внутри child у вас не должно быть проблем:

@Entity(name ="Parent") 
public class Parent { 
    @Id 
    @Column 
    private int id; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinColumn(name= "paren_id") 
    private Set<Child> children; 
    //getters and setters 
} 

@Entity(name ="Child") 
public class Child{ 
    @Id 
    @Column 
    private int id; 

    @ManyToOne 
    private Parent parent; 

    //getters and setters 
} 
Смежные вопросы