我的“Persona”实体中有此关系
@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);
}
当我获得Result对象时,它已经加载了具有迫切需要的对象,除了在“Trabajo”实体中加载了“Atenciones”集之外,一切都是正常的。我怎么才能解决这个问题呢?
在我的Trabajo实体中,我还有其他@OneToMany关系具有延迟获取,但仍然可以加载对象,我不知道为什么。
当我使用推土机mapperService时,它Map所有的整个树对象,并且我可以看到所有不应该出现的对象。
3条答案
按热度按时间fafcakar1#
延迟加载并不意味着不会加载数据。这意味着只有当您(在本例中为Dozer)请求数据的值时,才会加载数据。
假设您有一个Entity Manager,它具有一个具有实体Worker的OneToMany。假设关联是延迟加载的。以下是将会发生的事情:
它是懒惰的,因为它只在你真正需要的时候才加载。
因此,如果您不想在使用DozerMap时将Worker与管理器一起返回,请确保Dozer不会尝试获取Worker。有两个简单的解决方案可以做到这一点:
Manager
实体Map到不包含工作者列表的ManagerDTO
类。rt4zxlrg2#
关于延迟加载here有一个很好的解释。您看到的可能是代理对象。检查激发的SQL以验证数据是否真的是从数据库加载的。如果没有与‘Atencion’相关的表上的查询,请不要担心
您的推土机Map可能正在访问‘atenciones’元素,这会导致从数据库加载记录。如果您不希望发生这种情况,应该有一种方法将某些字段从Map中排除。
bt1cpqcv3#
在使用
Specification
时,我不得不将Join
转换为不相关的类。我没有找到一个很好的方法来加入他们,并将@OneToOne
关系放在其中的一个类上。这种方式导致获取不必要的属性,我只是通过@ManyToOne
Map它们,尽管我不需要关系。无论如何,我解决了我不必要的取回问题。注意:我不需要Map类。所以我不会调用任何GET方法。