【问题标题】:Why I'm getting Javassist objects in the middle of a result set?为什么我在结果集中间获取 Javassist 对象?
【发布时间】:2013-08-28 12:43:11
【问题描述】:

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

实体很简单,如下所示:

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

【问题讨论】:

  • 那些是代理。尝试将您的 fetch 设置为 EAGER
  • 在这种情况下这是不可接受的,请注意检索到的第一个实体的 cadastroList 包含 1478 个实体。如果我在此使用 Eager,我将遇到性能问题,一旦 Cadastro 实体是一个复杂的实体并且与 fetch Eager 有一些关系
  • 你解决了吗?我也面临同样的问题!

标签: java hibernate jpa-2.0 javassist


【解决方案1】:

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

【讨论】:

  • 有什么办法可以最小化这个问题吗?
  • 这通常不是问题,如果你使用 getter 而不是普通的字段访问,我看到你这样做。您是否真的在代码执行期间看到空值,或者只是在调试控制台中看到空值?我想你这样做了,这就是为什么你费心在调试控制台中检查它的原因。也许它与休眠会话生命周期有关?不过,我希望在这种情况下出现 LazyInitializationException。
  • 尝试扩展代理对象的处理程序字段,您应该会看到您的 Empresa 对象的副本,其中数据填充有数据库值
  • @MarcinŁoś 我在实体中使用 getter 和 setter,我只是将它隐藏起来,以免代码变长。空值的出现非常罕见。让我印象深刻的是结果中间的两个实体是代理。
猜你喜欢
  • 2023-03-03
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 2013-07-24
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多