Как задать предел или уровень рекурсии круговой связи с помощью бульдозера


У меня есть два класса сущностей JPA2, которые ссылаются друг на друга

class Person {
   int id;
   String name;
   @ManyToOne(fetch = FetchType.LAZY)
   Company company;
}

class Company{
   int id;
   String name;
   @ManyToOne(fetch = FetchType.LAZY)
   Person representative;
}

Имея эти данные:

Company company1 = Company(1,"Company1", 2)
Company company2 = Company(2,"Company2", 1)

Person person1 = Person (1,"Person1", 1)
Person person2 = Person (2,"Person2", 2)

Person2 работает на компанию 2, чьим представителем является person1, которая работает на компанию 1, чьим представителем является еще раз person2

Я знаю, что бульдозер способен скопировать эту модель в ДТО (в CompanyDTO и PersonDTO). В моих тестах они работают и имеют бесконечные уровни рекурсии. Я понимаю это потому, что Dozer использует те же экземпляры объектов, что и ссылки в DTO.

Мой вопрос в том, что если бы были тысячи людей, которые представляют сотни компаний, не мог бы граф экземпляра PersonDTO быть слишком большим, чтобы справиться? Как я могу указать какой-то предел для этой ситуации?
1 3
dto

1 ответ:

Есть две возможные стратегии, чтобы справиться с этой ситуацией.

  1. перед вызовом Dozer цикл через модель данных, чтобы вызвать ленивую загрузку до нужной глубины. Затем используйте функцию прокси-обработки бульдозера, чтобы он развернул объект и больше не запускал ленивую загрузку (http://dozer.sourceforge.net/documentation/proxyhandling.html ). существует прокси-обработчик для Hibernate, если вы используете Eclipse Link или что-то еще, что вы должны написать свой собственный.
  2. Напишите пользовательский конвертер (http://dozer.sourceforge.net/documentation/customconverter.html ), который будет пересекать иерархию объектов до нужного вам уровня. Это может быть сделано с помощью mapperaware рекурсивный пользовательский конвертер или простой конвертер, используя ThreadLocal в качестве счетчика уровня.