2012-04-26 2 views
2

나는 Hibernate 3.6 Final, Guice-persist 및 JPA2를 사용한다.JPA2 + Hibernate + Guice-persist : 버전 동작

이렇게 좋게 구성 했으므로 콩에는 getter와 setter가있는 @Version private Long version;이 있습니다.

모든 필드와 함께 equals 및 hashcode를 구현했습니다.

저장 방법 내 DAO이다 : 나는 이름을 변경하고 다시 저장하려고하면, 나는 "StaleObjectstateException을 가지고, 그리고

Product p = new Product("name"); //id=null, version=null 
dao.save(p); //works, id!=null, version=0 
Product p2 = new Produto(10, 0, "other name"); //id, version, name 
dao.save(p2); //works, but the version isnt updated, so my version still 0 

: 내가 좋아하는 뭔가를 할 경우,

@Transactional 
public void save(Product p){ em.persist(p); } 

그러나 행이 업데이트되거나 삭제 된 이유는 ... "...

개체를 저장할 때 엔티티 관리자가 버전을 업데이트하기 위해해야 ​​할 일이 무엇인지 알고 싶습니다. 왜이 작업을 계속하지 않았습니까?

미리 감사드립니다.

답변

1

문제는 다음과 같습니다.

@Transactional 
public void persist(B bean) { 
    em.persist(bean); 
} 

@Transactional 
public B update(B bean) { 
    bean = em.merge(bean); 
    em.flush(); 
    return bean; 
} 

그런 다음 LL 저장 방법 및이 방법이해야 할 일을 알고 :

@Transactional 
public B save(B bean) { 
    if (bean == null || bean.getId() == null) { 
     persist(bean); 
    } else { 
     bean = update(bean); 
    } 
    return bean; 
} 
2

(코드가 새 제품이 아니라 새로운 Produto라고 말하는 것을 무시 함) p2의 경우 객체 설치시 ID와 버전을 설정 한 다음 유지합니다. 개체의 상태를 지속 한 후 p2는 마지막으로 알려진 지속 상태와 변경되지 않고 버전을 업데이트 할 필요가 없습니다.

( p2.setName 같은 작업을 수행 ("또 다른 이름"), 다음 p2.getVersion이() ... 효과를 볼 수 않습니다.

페이지의 오토는도 직접 모든 버전을 가지고 있지 않았다 "당신"이 PresenceenceContext를 통해 "당신"에 의해 설정하면됩니다. 일단 p를 유지하면 퍼시스턴스 컨텍스트에서 관리되므로 버전 번호를 얻습니다.이 경우 버전 0 (새로 생성됨)이됩니다.

+2

을 흠 ... 내가 이해 .. 문제는 그래서 .. 내가 GWT를 사용, 그래서 DTO의에 변환을 할 필요가 등이다, 나는 보여주는 예제와 같은 것을해야한다. 이것을 해결할 좋은 방법에 대한 아이디어가 있는가? 사실, 나는 bean을 반환하는 "save"메소드를 만들었고, persist 또는 merge를 호출하는지, 병합을 호출 할 때, 또한 플러시를 수행 한 다음 빈을 리턴 하는지를 결정합니다. 이 방법은 작동하지만 추한 ... BTW, 답변 주셔서 감사합니다 :) – caarlos0

+0

죄송합니다, GWT/GIN 경험이 없습니다. 일반적으로 독립된 엔티티에서는 적절한 DTO를 만들 수 있지만 현재 사용 사례에 대해 특별한 특성이 필요한지 여부는 알 수 없습니다. – esej