Я пишу одну функцию в hibernate, чтобы рекурсивно инициализировать все свойства объекта рекурсивно, так что загружается весь объектный объект.
У меня есть два сложных сценария, где мне нужно использовать этот
1) самокомпозитный объект, такой как категория и подкатегория...
@Entity
public class Category {
@Column(nullable = false, length = 50)
@NotNull
@Size(max = 50, message = "{50}")
protected String name;
@ManyToOne(targetEntity = Category.class, fetch = FetchType.LAZY, optional = true)
private Category parentCategory;
}
2) сложный граф объектов, у которого есть много объектов для инициализации, прежде чем он может быть использован.
Проблема заключается в том, что я не могу использовать целеустремленный выбор, потому что мне нужен весь этот график объекта только в выборочных случаях, и я хочу обобщить код, поэтому не нужно писать запросы HQL для объектов.
Я написал частичный код для этого,
public void recursiveInitliaze(Object obj) throws Exception {
if(!Hibernate.isInitialized(obj))
Hibernate.initialize(obj);
PropertyDescriptor[] properties = PropertyUtils.getPropertyDescriptors(obj);
for (PropertyDescriptor propertyDescriptor : properties) {
Object origProp = PropertyUtils.getProperty(obj, propertyDescriptor.getName());
if (origProp != null) {
this.recursiveInitliaze(origProp);
}
if (origProp instanceof Collection && origProp != null) {
for (Object item : (Collection) origProp) {
this.recursiveInitliaze(item);
}
}
}
}
но у него есть одна проблема, она заканчивается в stackoverflow для вызова метода из-за двунаправленных отношений. поэтому, как обнаружить там двунаправленную связь или есть ли лучший способ реализовать это?
Я думаю, что профиль fetch также может помочь, но все же хочет попытаться реализовать это, если это возможно, поскольку сложно настроить профиль выборки на текущем этапе проекта.