2013-11-12 5 views
0

음, "ItemBudget"목록이있는 "Consultation"이라는 클래스가 있고 "Budget"이라는 클래스가 있으며 "ItemOrcamento"목록도 있습니다. 관계 상담 < -> ItemBudget이 ManyToMany이고 관계 예산 < -> ItemBudget이 OneToMany입니다. JSF에서JPA에서 게으른 개체의 이상한 초기화

난 다음을 수행하십시오

<p:dataTable rowKey="#{item.id}" var="item" value="#{consultationMB.consultation.budget.itensAsList}" selection="#{consultationMB.itemBudget}" > 

내가 방법을 사용하여 데이터 테이블 태그를 primefaces 대신 HashSet에의 ArrayList를을 (반환 "getItensAsList")는()가 제대로

으로 읽을 수 없습니다

if (!itemBudget.getSituation().getCode().equals("WAITING_CONCLUSION")){ 
    //some code here 
} 

내가 모든 필드 위의 코드를 만들 때 : 난 다음 실행하려고 ConsultationMBImpl라는 내 ManagedBean은 그렇게 당신은 나의 선택 "itemBudget"입니다 볼 수 있습니다 "Dentist_javassist_32", "Situation_javassist_49"... 모든 필드가 null이거나 0입니다. 상황, 치과 의사 및 다른 사람들은 다음과 같은 다른 클래스를 참조합니다.

+0

코드에 영어 이름을 사용하면 어떨까요? –

+0

번역 할 수 있지만이 코드는 원래 코드입니다. 왜냐하면 포르투갈어를 사용하고 코드는 모두 pt-br이기 때문입니다. – Shelly

+0

나는 이미 나의 코드를 번역하고있다. – Shelly

답변

3

원래 개체 대신 프록시 (_javassist 접미사)를로드하는 최대 절전 모드이 원인입니다. IDE로 코드를 디버깅하고 즉시 getter를 호출하려고하면 실제 값을 얻을 수 있습니다. 심지어 속성의 경우 null 인 것 같습니다.

왜 그렇게 되었습니까? ORM 도구에서 실제 개체가 아닌 프록시를로드하는 것이 훨씬 빠르기 때문입니다. 최대 절전 모드 keeps a cache에 이미로드 된 개체가있는 경우 DB를 반복해서 누르지 않아도됩니다.

게으른로드를 피하려면 최대 절전 모드 세션에서 load 메서드 대신 get을 사용할 수 있습니다. 또한 그것의 관계를 위해서, 그것들을 lazy="false"으로 표시 할 수 있기 때문에, Hibernate는 그것들을 실제 객체로 로딩 할 것이다. 이미로드 된 인스턴스의 프로비저닝을 직접 취소하려면 some methods이 있어야합니다.

그러나 엄격히 요구하지 않는 한 그렇게하지 마십시오. 앞서 말했듯이, 그것은 Hibernate로 하여금 DB로부터 더 많은 정보를로드하게하고 결과적으로 느슨한 결과를 가져올 것입니다.

+0

아주 좋은 설명, 이것을 읽고 내 코드를 분석하면 내 문제를 이해합니다. @XTreme Biker에 감사드립니다. 하지만 의심의 여지가 : 프록시 대신 CGLIB 대신 Javassist를 사용하는 이유는 무엇입니까? – Shelly

+0

이것은 Hibernate [팀의 결정] (http://in.relation.to/Bloggers/DeprecatedCGLIBSupport)입니다. –

관련 문제