如何使用Dozer指定循环关系的递归限制或级别

时间:2013-03-28 19:53:25

标签: java dto dozer

我有两个相互引用的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为company2工作,其代表是person1,为company1工作,其代表再次为person2

我知道Dozer能够将此模型复制到DTO(CompanyDTO和PersonDTO)。在我的测试中,它们工作并具有无限级别的递归。我理解这是因为Dozer使用相同的实例化对象作为DTO中的引用。

我的问题是,如果有成千上万的人代表数百家公司,那么PersonDTO实例的图表难道无法处理吗?如何为这种情况指定某种限制?

1 个答案:

答案 0 :(得分:4)

有两种可能的策略来处理这种情况。

  1. 在调用Dozer循环数据模型之前触发延迟加载直到您需要的深度。然后使用Dozer的代理处理功能,因此它将解包该对象并且不再触发延迟加载(http://dozer.sourceforge.net/documentation/proxyhandling.html)。 Hibernate有一个代理处理程序,如果你正在使用Eclipse Link或其他东西你必须编写自己的代理处理程序。
  2. 编写自定义转换器(http://dozer.sourceforge.net/documentation/customconverter.html),它将遍历对象层次结构,直到您需要的级别。可以使用MapperAware递归自定义转换器或使用ThreadLocal作为级别计数器的普通转换器来完成。