2015-09-12 3 views
1

У меня возникла проблема с спящей и ленивой загрузкой объектов. в основном я хочу, чтобы загрузить класс, который имеет жадность загруженного поле, а не загружать ленивые поля дочерних классовHibernate Lazy Loading делает критерии медленными для запуска

Возьмут следующий QuestionVO класс

@Entity 
@Table(name = "question") 
public class QuestionVO extends BaseDAOVO implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -5867047752936216092L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", unique = true, nullable = false) 
    private Integer id; 

    @Column(name = "questionText", unique = false, nullable = false, length = 4000) 
    @Size(min = 3, max = 4000) 
    @Pattern(regexp = MobileAppsRegexConstants.GENERAL_ALLOWED_CHARCHTERS, message = "Question Text Not valid.") 
    private String questionText; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @Cascade({ CascadeType.SAVE_UPDATE }) 
    @JoinColumn(name = "MENU_STYLE_ID", nullable = true) 
    private MenuStyleVO menuStyle; 

    } 

Возьмут следующий класс MenuStyleVO

@Entity 
@Table(name = "menu_style") 
public class MenuStyleVO extends BaseDAOVO implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 3697798179195096156L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", unique = true, nullable = false) 
    private Integer id; 

    @Column(name = "menuStyleName", unique = false, nullable = false, length = 200) 
    private String menuStyleName; 

    @Column(name = "menuTemplate", unique = false, nullable = false, length = 200) 
    private String menuTemplate; 

    @OneToOne(fetch = FetchType.LAZY, optional=false) 
    @Cascade({ CascadeType.SAVE_UPDATE }) 
    @JoinColumn(name="logo_id") 
    @JsonProperty("logo") 
    private ApplicationImageVO logo; 


    } 

И это ApplicationImageVO класс

@Entity 
@Table(name = "application_image") 
public class ApplicationImageVO extends BaseDAOVO implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -9158898930601867545L; 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "image1242x2208") 
    @Cascade({ CascadeType.ALL }) 
    @JsonIgnore 
    private SubmissionLauncherImagesVO launcherImage1242x2208; 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "image1536x2048") 
    @Cascade({ CascadeType.ALL }) 
    @JsonIgnore 
    private SubmissionLauncherImagesVO launcherImage1536x2048; 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "image2048x1536") 
    @Cascade({ CascadeType.ALL }) 
    @JsonIgnore 
    private SubmissionLauncherImagesVO launcherImage2048x1536; 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "logo") 
    @Cascade({ CascadeType.ALL }) 
    @JsonIgnore 
    private MenuStyleVO menuStyleLogo; 

    } 

Если L загружает класс QuestionVO из базы данных, используя следующий код критериев спящего режима - все ленивые поля MenuStyleVO и ApplicationImageVO также загружаются.

В сложных случаях использования, это приводит этот запрос становится очень медленным

public QuestionVO findMasterAppQuestionById(int id) { 

    Criteria criteria = currentSession().createCriteria(QuestionVO.class); 
    criteria.add(Restrictions.eq("id", id)); 

    QuestionVO questionVO = (QuestionVO) criteria.uniqueResult(); 

    return questionVO; 
} 

Что мне интересно, это - было бы возможно загрузить класс QuestionVO и его нетерпеливые поля и Телль зимуют игнорировать ленивые поля из других классов выберете те, которые вам нужны?

Приветствие Damien

ответ

0

Последний раз, когда мы столкнулись с такой проблемой, как это мы использовали конструктор по родительскому классу, которые используют только нужные поля определенного запроса.

Я не могу вспомнить, в полной мере, как работает конструктор в запросе jpql, но это должно быть что-то вроде этого:

select new com.package.class(c.field1, c.field2) from com.package.class c 

Помните, что конструктор с тем же аргументами должен присутствовать на желаемое лице.

Плюсы: - Лучшее выполнение запросов; - Может быть воспроизведен с другими аргументами;

Против: - Довольно ограниченный, вы можете использовать этот взлом только на основной сущности, которую вы запрашиваете; - Включает конструктор только для определенного запроса, плохой дизайн;

Также вы должны взглянуть на EnttyGraphs JPA. Кажется весьма многообещающим, но в нашем проекте он не работал по желанию.

Btw, Hibernate много раз поставил нас на проблемы с производительностью, надеюсь, что этот взлом поможет вам, удачи!

Edit:

Почему эта модель поможет в вопросах производительности? В основном, с примером, который я показал ранее, вы не загружаете все через Hibernate, только два поля (field1 и field2) основного объекта. Без использования конструктора вы не сможете этого сделать, потому что ваш запрос не приведет к набору желаемого объекта, а в коллекции из двух объектов каждая итерация (Object []). Используя шаблон конструктора, вы создаете экземпляры желаемого объекта, но только выбираете несколько полей из базы данных, и именно поэтому этот шаблон может вам помочь, вы возвращаете коллекцию желаемого объекта только с несколькими полями.

+0

Привет, спасибо, что вернулись ко мне. Я не знаю, как здесь может помочь конструктор, если мы загружаем все через спящий режим. можете ли вы подробнее объяснить? – Damien

+1

Обновлен ответ, пожалуйста, проверьте его. – Bonifacio

+0

hI - спасибо за обновление. я понимаю, что вы имеете в виду, что это взлом. возможно, так оно и есть, но, надеюсь, кто-то может придумать другую альтернативу. Все равно - ваш вклад очень ценен. – Damien