为什么我在结果集中间获取Javassist对象?

时间:2013-08-28 12:43:12

标签: java hibernate jpa-2.0 javassist

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

javassist problem debug

实体很简单,如下所示:

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

1 个答案:

答案 0 :(得分:2)

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