我有FetchType.LAZY和Hibernate对象仍在加载

yrwegjxp  于 2022-11-14  发布在  其他
关注(0)|答案(3)|浏览(142)

我的“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所有的整个树对象,并且我可以看到所有不应该出现的对象。

fafcakar

fafcakar1#

延迟加载并不意味着不会加载数据。这意味着只有当您(在本例中为Dozer)请求数据的值时,才会加载数据。
假设您有一个Entity Manager,它具有一个具有实体Worker的OneToMany。假设关联是延迟加载的。以下是将会发生的事情:

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.

它是懒惰的,因为它只在你真正需要的时候才加载。
因此,如果您不想在使用DozerMap时将Worker与管理器一起返回,请确保Dozer不会尝试获取Worker。有两个简单的解决方案可以做到这一点:

  • 不要使用推土机(这很糟糕,IMHO)
  • Manager实体Map到不包含工作者列表的ManagerDTO类。
rt4zxlrg

rt4zxlrg2#

关于延迟加载here有一个很好的解释。您看到的可能是代理对象。检查激发的SQL以验证数据是否真的是从数据库加载的。如果没有与‘Atencion’相关的表上的查询,请不要担心
您的推土机Map可能正在访问‘atenciones’元素,这会导致从数据库加载记录。如果您不希望发生这种情况,应该有一种方法将某些字段从Map中排除。

bt1cpqcv

bt1cpqcv3#

在使用Specification时,我不得不将Join转换为不相关的类。我没有找到一个很好的方法来加入他们,并将@OneToOne关系放在其中的一个类上。这种方式导致获取不必要的属性,我只是通过@ManyToOneMap它们,尽管我不需要关系。无论如何,我解决了我不必要的取回问题。
注意:我不需要Map类。所以我不会调用任何GET方法。

相关问题