2013-02-06 6 views
0

참조 된 ItemVersion 개체가있는 엔티티 회사가 있고, JPA (eclipselink)를 지속성 레이어로 사용합니다. 코드 추출은 여기에 주어진다 :GWT RequestFactory : 계단식 객체에 업데이트가 전파되지 않음

@Entity 
public class Company{ 
    private String instance; 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "fk_item_version_id") 
    private ItemVersion itemVersion; 
} 

@Entity 
public class ItemVersion{ 
    private String comment; 
... 
} 

나는 회사 객체를 만들고 그것을 유지할 수있다. 나는 또한 새로운 객체를 찾고, 속성 "instance"를 업데이트하고 그것을 지속 할 수있다. 참조 된 ItemVersion 객체의 "comment"속성을 변경하면이 변경 사항이 서버 측에 저장되지 않습니다.

등의 테스트 코드가 보인다/업데이트를 만듭니다

final EventBus eventBus = new SimpleEventBus(); 
final AftdRequestFactory requestFactory = GWT.create(AftdRequestFactory.class); 
requestFactory.initialize(eventBus); 

final CompanyRequest request = requestFactory.companyRequest(); 
final CompanyProxy newCompany = request.create(CompanyProxy.class); 
newCompany.setInstance("1"); 
ItemVersionProxy newVersion = request.create(ItemVersionProxy.class); 
newVersion.setComment("first comment"); 
newCompany.setItemVersion(newVersion); 

request.persist().using(newCompany).fire(new Receiver<Void>() { 
    @Override 
    public void onSuccess(Void arg0) { 
    final CompanyRequest request2 = requestFactory.companyRequest(); 
    Request<CompanyProxy> p = request2.findCompany(1L).with("itemVersion"); 
    p.to(new Receiver<CompanyProxy>() { 
     @Override 
     public void onSuccess(CompanyProxy response) { 
      final CompanyRequest request3 = requestFactory.companyRequest(); 
      final CompanyProxy editableCompany2 = request3.edit(response); 
      editableCompany2.setInstance("2"); 
      editableCompany2.getItemVersion().setVersionNumber(2); 
      request3.persist().using(editableCompany2).fire(new Receiver<Void>() { 
       @Override 
       public void onSuccess(Void arg0) { 
        // persist company version 
        System.out.println("company updated"); 

그러나, "예"와 "주석"에 대한 업데이트가 와이어를 넘어 (체크 느릅 나무 클라이언트와 서버 사이의 와이어 샤크)하지만 지속에 Company의 메소드에서 인스턴스가 업데이트되고 따라서 이전 주석이 저장되는 동안 참조 된 ItemVersion 객체와 해당 "comment"속성은 업데이트되지 않습니다.

는 회사의 방법을 보이는 계속 같은 :

public void persist() throws PersistenceException { 
    EntityManager em = emf.createEntityManager(); 
    EntityTransaction tx = null; 
    try { 
     tx = em.getTransaction(); 
     tx.begin(); 
     Company existingEntity = findCompany(getId()); 
     if (existingEntity == null) { 
      em.persist(this); 
     } else { 
      setId(existingEntity.getId()); 
      em.merge(this); 
     } 
     tx.commit(); 
    } catch (RuntimeException e) { 
     tx.rollback(); 
     throw e; 
} 

검색과 em.persist 결과 또는 간단한 어떤 저장하지 않습니다 유지하기 때문에 때 em.merge이 필요하다 검색에 따라와 주변 작업 업데이트.

+0

서버 측에서 OpenSessionInView, 즉 요청 당 세션 패턴을 사용하고 있습니까? (또는 다른 말로하면 JPA의 EntityManager의 수명을 어떻게 관리하고 있습니까?) –

+0

위의 Company.persist() 코드를 추가했습니다. 나는 또한 문제의 근본 원인이 서버 측에 있다고 생각한다. 내 이해에 따르면, 나는 Company.persist()에서 모든 업데이트 된 참조를 포함하여 업데이트 된 개체를 볼 수 있지만 내가 말했듯이, 나는 ItemVersion이 아닌 Company의 업데이트 만 볼 수 있습니다. 지금 당장은 RequestFactory *와 * JPA를 함께 사용하는 완전한 소스 코드 예제를 찾지 못했습니다. 링크를 제공 할 수 있습니까? 많은 감사합니다. – Georg

답변

0

MUST는 RequestFactory으로 (즉, 요청의 수명 기간 동안 동일한 EntityManager 인스턴스를 공유) 오픈 세션에서 시청/세션 요청 당 패턴을 사용한다; 자세한 내용은 https://code.google.com/p/google-web-toolkit/issues/detail?id=7827을 참조하십시오.

+0

바로 그게 문제였습니다. 같은 EntityManager 인스턴스를 사용하면 문제가 해결됩니다. 고맙습니다! – Georg

+0

몇 가지 코드를 게시 할 수 있습니까? – kozla13

+0

https://community.jboss.org/wiki/OpenSessionInView? –