我有一个非常有趣的问题。我在服务器上设置了一些值,将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;
}
}
答案 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中。这是唯一有效的方法。