2010-11-28 4 views
2

동안 데이터베이스의 변경 사항을 얻을 수 없습니다 : 대화의 시작 부분이라고합니다)SEAM/최대 절전 모드 : 나는 클래스 가지고 대화

@Name("foo") 
@Scope(ScopeType.CONVERSATION) 
public class Foo { 

    @In 
    Session session; 

    @In 
    private Conversation conversation; 

    @RequestParameter 
    Long barId; 

    /* outjected fields */ 
    @Out 
    Bar bar; 

    /* some attributes and methods */ 

    public void start() { 
     /* some initializations */ 
     this.bar = (Bar) session.get(Bar.class, barId); 
    } 

    public void end() { 
     /* some actions involving bar and bar.getBaz() */ 
     conversation.end(); 
    }   
} 

방법의 시작 (및 속성 표시 줄을 초기화 (바 어떤 엔티티 클래스입니다.) 그런 다음 bar는 엔티티 인 baz 속성을 갖습니다.

대화 중에 다른 사용자가 Google 바와 관련된 baz 개체를 수정하는 경우가 발생할 수 있습니다. 그런 다음 end()가 호출되면 bar.getBaz()는 이전 (변경되지 않음) 버전의 baz를 반환하고 은 데이터베이스에을 덮어 씁니다.

session.flush(), session.merge (bar), session.merge (bar.getBaz())를 사용하여 end() 메서드에서 baz의 수정 된 상태를 가져 오려고했지만 아무 것도 작동하지 않습니다. 데이터베이스에서 오염을 피하려면 어떻게해야합니까?

답변

1

정교한 대답으로 나올 수 없어서 죄송합니다. 나는 다른 서버 렛에 의해 수정 된 DB에서 엔터티를 다시로드해야했습니다. JPA의 refresh() 메서드를 사용하여이 작업을 수행했습니다. Hibernate 세션도 refresh() 메소드를 제공합니다. 낙관적 잠금을위한 @Version 주석을 고려할 수도 있습니다.

+0

고마워요! session.refresh (bar.getBaz())가 작동했습니다! 응용 프로그램이 이미 프로덕션 상태이고 데이터베이스 스키마를 변경할 수 없으므로 @Version을 사용할 수 없습니다. – janek37