Java 为什么我在结果集中间得到javSoice对象?

Java 为什么我在结果集中间得到javSoice对象?,java,hibernate,jpa-2.0,javassist,Java,Hibernate,Jpa 2.0,Javassist,当我试图从数据库中检索一些实体时,遇到了一个奇怪的问题。实体所在的表只有4行。当我尝试选择所有行时,我会得到一个列表,其中第一个和最后一个元素加载正确,但是第二个和第三个元素的所有属性都为null。以下是我的调试控制台的打印: 实体很简单,如下所示: @Entity @Table(name = "Empresa") public class Empresa implements Serializable { @Id @GeneratedValue(strategy = Gene

当我试图从数据库中检索一些实体时,遇到了一个奇怪的问题。实体所在的表只有4行。当我尝试选择所有行时,我会得到一个列表,其中第一个和最后一个元素加载正确,但是第二个和第三个元素的所有属性都为null。以下是我的调试控制台的打印:

实体很简单,如下所示:

@Entity
@Table(name = "Empresa")
public class Empresa implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID_EMPRESA")
    private Integer idEmpresa;
    @Basic(optional = false)
    @Column(name = "NOME_EMPRESA")
    @OrderColumn
    private String nomeEmpresa;
    @Column(name = "CNPJ")
    private String cnpj;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "iDEmpresa", fetch = FetchType.LAZY)
    private List<Cadastro> cadastroList;

}
如果您想知道我是如何检索实体的,下面是代码:

@Override
public List<T> recuperarTodos() {
    Query query = entityManager.createQuery(criarQueryRecuperarTodos());
    limitarQuantidadeDeRegistros(query);
    return query.getResultList();
}

private String criarQueryRecuperarTodos() {
    StringBuilder builder = new StringBuilder("SELECT e FROM ");
    builder.append(classe.getSimpleName());
    builder.append(" e");
    builder.append(criarParametrosOrdenacao());
    return builder.toString();
}

这是完全合法和预期的情况。Hibernate使用动态生成的代理,因此javaassist对象,在过去Hibernate使用cglib以及占位符来表示未完全获取的实体,以允许延迟获取。因此,一般来说,您不应该尝试直接访问属性值。相反,使用getter允许hibernate发出适当的DB查询并填充实体。在某些情况下,这可能是一个问题—例如,如果值是在Hibernate会话之外首次请求的。

这些是代理。尝试将获取设置为“急切”。在这种情况下,这是不可接受的,请注意,检索到的第一个实体的地籍目录包含1478个实体。如果我在这里使用eager,我会有性能问题,一旦Cadastro实体是一个复杂的实体,并且与fetch有一些关系,您解决了这个问题吗?我也面临同样的问题!有什么方法可以最小化这个问题吗?如果您使用getter而不是普通的字段访问,这通常不是一个问题,我看到您是这样做的。在代码执行期间,或者仅仅在调试控制台中,您是否确实看到空值?我想是的,这就是为什么你费心在调试控制台中检查它的原因。也许这与hibernate会话生存期有关?在这种情况下,我希望LazyInitializationException会出现异常。尝试展开代理对象的处理程序字段,您应该会看到Empresa对象的副本,其中数据由数据库填充values@MarcinŁoś我在实体中使用getter和setter,我只是将其隐藏起来以避免代码变长。出现空值的情况非常罕见。这里给我的印象是,结果中间的两个实体是代理。