2012-11-08 4 views
0

나는 아주 흥미로운 문제가 있습니다. 서버에 값을 설정하고 클라이언트에게 bean을 보낸 다음 값없이 서버 으로 돌아옵니다.
1. 클라이언트가 좀 과도 속성을 설정 3.
나 최대 절전 모드를 통해 데이터베이스에서 빈을 가져
2 EntityRequest.getEntity (PARAMS) (I를 통해 DB에서 일부 콩을 요청 여기
Gwt 요청 빈 업데이트 문제

내가 할 것입니다 클라이언트 측에서 필요로하고 DB에 저장하고 싶지는 않음)
4. Bean을 EntityRequest의 메소드를 통해 클라이언트로 보냅니다.
5. 클라이언트가 다른 값을 변경하고 호출이 지속됩니다.
6. 서버는 자신의 콩 및
를 다시 수신 - 무시 서버에서 설정 한 속성 (스텝 번호 3.) 삭제됩니다/- 제대로 클라이언트
에서 속성을 설정하고있다.

RF 메커니즘이 클라이언트의 변경 사항 만있는 새로로드 된 DB로드 된 버전을 보내는 것처럼 보입니다. 몇 가지 조사를 해봤고 빈 버전 문제가 있었던 것처럼 보입니다. bean은 버전 셋트를 가지고 있으며 (아래 참조), 그것은 Hibernate에 의해 사용되며 RF에 의해서도 사용된다.

고객에게 가치를 부여하고 되돌리려면 어떻게해야합니까? 나는 "entity.version ++"을 시도했다. 3 단계에서 작동하지만 작동하지 않습니다.

@Entity 
public class Person { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Version 
    private Integer version; 

    @Field 
    private String name; 

    @Transient 
    private Long participationId; 

    ... 

    public Long getId() { 
     return id; 
    } 

    public Integer getVersion() { 
     return version; 
    } 

    ... 
} 

public static Person findPerson(Long id) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    try { 

     Object p = session.get(Person.class, id); 
     session.getTransaction().commit(); 

     return p != null ? (Person) p : null; 

    } catch (RuntimeException e){ 
     logger.error("Person.findPerson", e); 
     session.getTransaction().rollback(); 
     throw e; 
    } 
} 
+0

로케이터 코드를 공유 할 수 있습니까? (당신이 사용하는 것에 따라'Person' 클래스의'public static Person findPerson (Long id)'메소드) –

+0

Thomas, 위의 findPerson 코드를 질문에 추가했습니다. 나 자신도 약간의 연구를 해봤고 findPerson (id)이 도메인 객체를 재구성 할 때 실제로 호출된다는 것을 발견했다. 내부 캐시를 사용하지 않는 이유는 무엇입니까? 도메인 객체 캐시를 사용하기 위해 findPerson을 다르게 코딩 할 수 있습니까? 고맙습니다. – hostnik

+0

당신은 ** (와 같이 : 당신이하고있는 일을 정말로 알지 못한다면) 반드시 JPA/Hibernate /와 함께 view_ 패턴에서 _open 세션을 사용해야하므로, 동일한 세션 (및 그 내부 캐시)를 요청 (실적 이외의 이유로). 요청 사이에 있지만 다른 캐시를 공유 할 수도 있지만 실제로 필요할 때까지 기다려야합니다. [_premature optimization은 모든 evil_의 근원입니다.] (http://c2.com/cgi/wiki?PrematureOptimization) –

답변

0

Thomas Broyer의 도움을 받아서 RequestFactory 메커니즘이 더 잘 이해되어 해결책이되었습니다. RequestFactory는 클라이언트 측에서 객체를 반환 할 때 domaing 객체를 캐시 밖으로 가져 오지 않고 신선한 객체를 가져 와서 diff로 처리합니다. 가져 오기는 Locator 또는 domain objet의 find (id) 함수를 사용하여 수행됩니다. 내 경우 엔 find (id)입니다.

해결책은 못생긴 해킹입니다.하지만 제대로 작동합니다. 이것은 내 사업체에 있습니다

public class Person { 
... 
@Transient 
private Long participationId; 

@Transient 
private Long participationStoreId; 
... 
} 

RF로 전송하기 전에로드 참여를 의뢰했습니다. 클라이언트 측에서 그것을 유지하기 위해, 다시 보내기 전에 내가 할 : 당신이 나에 계란을 던져 전에

person.setParticipationStoreId(person.getParticipationId()); 

, 나는 반복 : 나는 못생긴 해킹 알고있다. 그러나 어떤 경우에는 클라이언트에 엔티티에 대한 가치가 필요하며 DB에 필요하지 않습니다. 이것이 유일한 방법이었습니다.