Gwt Requestfactory bean更新问题

时间:2012-11-08 12:36:05

标签: hibernate gwt requestfactory

我有一个非常有趣的问题。我在服务器上设置了一些值,将bean发送到客户端,然后它返回服务器,没有该值

这是我的所作所为:
1.客户端通过EntityRequest.getEntity(params)从DB请求一些bean 2.我通过Hibernate从数据库中获取bean 3.我设置了一些瞬态属性(我在客户端需要它们,不希望它们存储在DB中)
4.通过EntityRequest的方法将bean发送给客户端 5.客户更改其他一些值并保持呼叫 6.服务器收回他的bean和
  - 已从客户端正确设置属性
  - 从服务器设置的属性(步骤3)被删除/忽略

看起来RF机制会向我发送新的数据库加载版本,只有来自客户端的更改。我做了一些研究,看起来一定有一些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;
    }
}

1 个答案:

答案 0 :(得分: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之前,我加载了participantId。在客户端,为了保留它,在发回之前我做:

person.setParticipationStoreId(person.getParticipationId());

在你向我扔鸡蛋之前,我再说一遍:我知道这是一个丑陋的黑客。但在某些情况下,我需要对客户端和实体返回一些实体值,我不希望它在DB中。这是唯一有效的方法。