2013-08-28 1 views
2

이 나는 ​​이상한 문제에 봉착했습니다. 엔티티가 사는 테이블은 단지 4 개의 행을가집니다. 모든 행을 선택하려고하면 첫 번째 요소와 마지막 요소가 올바르게로드 된 목록이 표시되지만 두 번째와 세 번째 요소는 모두 null로 모든 속성을 갖습니다. 아래 볼 수결과 집합의 중간에 Javassist 객체가 나타나는 이유는 무엇입니까? 나는 데이터베이스에서 일부 개체를 검색 할 때

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

프록시입니다. 가져 오기를 'EAGER'로 설정해보세요. –

+0

이 경우에는 검색 할 수없는 첫 번째 엔터티의 cadastroList에 1478 개의 엔터티가 포함됩니다. 내가 이것을 열심히 사용한다면, Cadastro 엔티티가 복잡하고 열망하는 관계를 가지고 일단 성능 문제가 발생할 것입니다. – brevleq

+1

이것을 해결 했습니까? 나는 똑같은 문제에 직면 해있다! – lmo

답변

2

이것은 매우 합법적이며 예상되는 상황입니다. 최대 절전 모드는 동적으로 lazy 페칭을 허용하지 않는 완벽하게 가져온 엔티티 자리로 (물론 CGLIB 사용 과거 최대 절전 모드에 따라서 javaassist 개체) 프록시를 생성 사용합니다. 이 때문에 일반적으로 속성 값에 직접 액세스해서는 안됩니다. 대신 getter를 사용하면 hibernate가 적절한 DB 쿼리를 실행하고 엔티티를 채울 수 있습니다. 이것은 몇몇 상황에서 문제가 될 수있다 - 예를 들어 값이 Hibernate 세션 외부에서 처음 요청 된 경우.

+0

이 문제를 최소화 할 수있는 방법이 있습니까? – brevleq

+0

일반 필드 액세스 대신 getter를 사용하면 일반적으로 문제가되지 않습니다. 코드 실행 중 또는 디버그 콘솔에서 실제로 null을 볼 수 있습니까? 내 생각에, 당신이 디버그 콘솔에서 그것을 확인하는 것을 귀찮게 여기는 이유입니다. 아마도 그것은 최대 절전 세션 수명과 관련이 있습니까? 나는 그런 경우에 LazyInitializationException을 기대할 것이다. –

+0

프록시 객체의 확장 핸들러 필드를 시도하면, 데이터가 데이터베이스 값으로 채워지는'Empresa' 객체의 복사본을 볼 수 있습니다. –

관련 문제