2

データベースからいくつかのエンティティを取得しようとすると、奇妙な問題が発生します。エンティティが存在するテーブルには 4 行しかありません。すべての行を選択しようとすると、最初と最後の要素が正しくロードされているリストが表示されますが、2 番目と 3 番目の要素はすべて null です。これが私のデバッグコンソールの出力です:

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 は、動的に生成されたプロキシ (したがって、過去の hibernate は cglib も使用していた javaassist オブジェクト) を、完全にフェッチされていないエンティティのプレースホルダーとして使用して、遅延フェッチを可能にします。このため、一般的に言えば、属性値に直接アクセスしようとすべきではありません。代わりに getter を使用すると、hibernate は適切な DB クエリを発行してエンティティを埋めることができます。これは、状況によっては問題になる可能性があります。たとえば、値が最初に Hibernate セッション外で要求された場合などです。

于 2013-08-28T13:05:00.883 に答える