У меня возникла проблема с спящей и ленивой загрузкой объектов. в основном я хочу, чтобы загрузить класс, который имеет жадность загруженного поле, а не загружать ленивые поля дочерних классов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
Привет, спасибо, что вернулись ко мне. Я не знаю, как здесь может помочь конструктор, если мы загружаем все через спящий режим. можете ли вы подробнее объяснить? – Damien
Обновлен ответ, пожалуйста, проверьте его. – Bonifacio
hI - спасибо за обновление. я понимаю, что вы имеете в виду, что это взлом. возможно, так оно и есть, но, надеюсь, кто-то может придумать другую альтернативу. Все равно - ваш вклад очень ценен. – Damien