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