1

我的“角色”实体 中有这种关系

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "persona")
private Empleado empleado;

在我的“ Empleado ”实体中,我有这种关系

@OneToMany(cascade = CascadeType.ALL, mappedBy = "empleado", fetch = FetchType.EAGER)
private Set<Trabajo> trabajos = new HashSet<Trabajo>();

我在我的“ Trabajo ”实体中有这种关系

@BatchSize(size = 100)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "trabajo", fetch = FetchType.LAZY)
private Set<Atencion> atenciones = new HashSet<Atencion>();

而GoogleCode提供的这种登录方式

@Override
public Persona acceder(String login, String password) {
    Search s = new Search();
    s.addFilterEqual("usuario", login);
    s.addFilterEqual("clave", password);
    return searchUnique(s);
}

当我得到结果对象时,它已经加载了具有 EAGER fecth 的对象,除了在“ Trabajo ”实体中加载“ Atenciones ”集或者它具有 LAZY 提取之外,一切都很好。我怎样才能解决这个问题?

在我的 Trabajo 实体中,我还有其他 @OneToMany 关系具有 LAZY fetch 并且仍然加载我不知道为什么的对象。

当我使用 dozer mapperService 时,它​​会映射所有整个树对象,我可以看到所有不应该出现的对象。

4

2 回答 2

3

延迟加载并不意味着数据不会被加载。这意味着数据只会在您(或 Dozer,在本例中)请求其值时加载。

假设你有一个实体 Manager,一个 OneToMany 和一个实体 Worker。并假设关联是延迟加载的。以下是将会发生的事情:

Manager manager = session.get(Manager.class, 1L); 
// the above line loads the manager data from the database, using a SQL query

List<Worker> workers = manager.getWorkers();
// the workers variable references a Hibernate-specific list which is lazy-loaded.
// It doesn't contain any data until a method is called on it

int size = workers.size();
// calling any method of the list will cause a SQL query to be executed. This
// SQL query will load the workers of the manager from the database, and fill the list
// finally, the size of the list will be returned.

它很懒惰,因为它仅在您真正需要时才加载。

因此,如果您不想在使用 Dozer 映射时将工作人员与经理一起返回,请确保 Dozer 不会尝试获取工作人员。有两种简单的解决方案可以做到这一点:

  • 不要使用推土机(这很糟糕,恕我直言)
  • Manager将实体映射到ManagerDTO不包含工作人员列表的类。
于 2013-02-24T17:59:27.460 回答
0

这里有一个关于延迟加载的很好的解释。您看到的可能是代理对象。检查触发的 sql 以验证数据是否真的从 db 加载。如果表上没有与“Atencion”相关的查询,请不要担心

您的推土机映射可能正在访问导致从 db 加载的记录的“atenciones”元素。如果您不希望这种情况发生,应该有一种方法可以从映射中排除某些字段。

于 2013-02-24T15:53:02.957 回答