2

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

javassist问题调试

实体很简单,如下所示:

@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();
}
4

1 回答 1

2

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

于 2013-08-28T13:05:00.883 回答