0

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

这是我所做的:
1. 客户端通过 EntityRequest.getEntity(params) 从数据库请求一些 bean
2. 我通过 Hibernate 从数据库中获取一个 bean
3. 我设置了一些临时属性(我需要它们在客户端并且不想要它们存储在 DB 中)
4. 通过 EntityRequest 的方法将 bean 发送到客户端。
5. 客户端更改了一些其他值并且调用仍然存在。
6. 服务器接收回他的 bean 并且
- 已从客户端正确设置属性
-从服务器设置的属性(第 3 步)是 ERASED / IGNORED

看起来 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;
    }
}
4

1 回答 1

0

在 Thomas Broyer 的帮助下,我更了解了 RequestFactory 机制,这使我找到了解决方案。RequestFactory 在从客户端返回对象时不会将域对象从缓存中取出,而是获取新的对象并对其进行比较。提取是使用定位器或域对象的 find(id) 函数完成的。在我的情况下是find(id)。

我知道,解决方案是一个丑陋的黑客,但它有效。这是我的实体

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

@Transient
private Long participationStoreId;
...
}

在我将它发送到 RF 之前,我加载了participationId。在客户端,为了保留它,在发回之前我会这样做:

person.setParticipationStoreId(person.getParticipationId());

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

于 2012-11-14T22:14:12.280 回答