4

我有两个相互引用的 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 实例的图表会不会太大而无法处理?如何为这种情况指定某种限制?

4

1 回答 1

4

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

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