2012-11-08 53 views
0

我有一個相當有趣的問題。我在服務器上設置了一些值,將bean發送到客戶端,然後返回到服務器,沒有該值Gwt Requestfactory bean更新問題

這裏是我做的:
1.客戶端通過EntityRequest.getEntity(PARAMS)
2.我從數據庫中通過Hibernate獲取一個bean
3.我設置一些短暫的屬性(我請求從DB一些豆子在客戶端需要它們,並且不希望它們存儲在數據庫中)
4.通過EntityRequest的方法將bean發送給客戶端。
5.客戶端更改其他一些值並調用保持。
6.服務器接收回他的豆和
- 屬性從服務器設定(步驟無3)被擦除/ IGNORED - 是已經適當從客戶端
設置屬性。

它看起來像射頻機制會發送我新鮮的數據庫加載版本只有客戶端的變化。我做了一些研究,看起來肯定有一些bean版本問題。該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

你能分享你的Locator代碼嗎? (或者'Person'類的'public static Person findPerson(Long id)'方法,取決於你使用的是什麼) –

+0

Thomas,我已經在上面添加了findPerson代碼。我自己也做了一些研究,發現實際上findPerson(id)被調用來重構域對象。爲什麼它不使用內部緩存?我可以用不同的方式編寫findPerson來使用域對象緩存嗎?謝謝。 – hostnik

+0

你**應該**(如:必須,除非你真的知道你在做什麼)在view_ pattern中使用JPA/Hibernate/_open會話,所以共享相同的會話(及其內部緩存)請求(除了性能以外的其他原因)。在請求之間,也許使用另一個共享緩存,但是最好等到你真的需要它([_prepare optimization is all of evil_](http://c2.com/cgi/wiki?PrematureOptimization)) –

回答

0

在Thomas Broyer的幫助下,我瞭解了更多的RequestFactory機制,這導致我找到了解決方案。 RequestFactory在從客戶端返回對象時不會將緩存對象從緩存中取出,而是取回新對象並對其進行區分。使用Locator或domain objet的find(id)函數完成提取。在我的情況是find(id)。

解決方案是一個醜陋的黑客,我知道,但它的工作原理。這是在我的實體上

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

@Transient 
private Long participationStoreId; 
... 
} 

在我將它發送到RF之前,我加載了participationId。在客戶端,以保持它,發回之前,我做:

person.setParticipationStoreId(person.getParticipationId()); 

之前,你在我丟雞蛋,我再說一遍:我知道這是一個醜陋的黑客。但是在某些情況下,我需要一些實體對客戶的價值,並且我不希望它在數據庫中。這是唯一有效的方法。