【发布时间】:2012-07-27 17:58:42
【问题描述】:
我正在使用 JPA 进行持久性的 GXT 项目,但我遇到了双向关系持久性的问题。
我有这两个实体:
@Entity
@Table(name = "ACTV_REQ", catalog = "erpdb")
@AttributeOverride(name = "id", column = @Column(name = "ID", nullable = false, columnDefinition = "BIGINT UNSIGNED"))
@NamedQueries(value = {
@NamedQuery(name = "findByPerson", query="select object(m) from ActvReq m where m.people= :people")
})
public class ActvReq extends BaseEntity {
@ManyToOne
@JoinColumn(name = "PPL_ID")
@NotNull
private People people;
@ManyToOne
@JoinColumn(name = "ACTV_TYP_ID")
private ActivityTyp actvTyp;
@ManyToOne
@JoinColumn(name= "PPL_ACTV_RIGHT_ID")
private PeopleActvRight pplActvRight;
@Column(name = "DESCR")
private String desc;
}
还有:
@Entity
@Table(name = "PPL_ACTV_RIGHT", catalog = "erpdb")
@AttributeOverride(name = "id", column = @Column(name = "ID", nullable = false, columnDefinition = "BIGINT UNSIGNED"))
@PeopleActvRightBeanConstraint
@NamedQueries(value = {
@NamedQuery(name = "findByPeople", query="select object(m) from PeopleActvRight m where m.people= :people")
})
public class PeopleActvRight extends BaseEntity {
@ManyToOne
@JoinColumn(name="ACTV_TYP_ID")
@NotNull
ActivityTyp type;
@ManyToOne
@JoinColumn(name="PPL_ID")
@NotNull
People people;
@ManyToOne
@JoinColumn(name="ACTV_RIGHT_ID")
ActvRight actvRight;
@OneToMany(mappedBy="pplActvRight",cascade=CascadeType.ALL)
private List<ActvReq> actvRequests = new ArrayList<ActvReq>();
}
(我没有复制 getter 和 setter,但这些方法存在。)
对于ActvReqProxy的持久化,在我的EditorPresenter中基本上是这样完成的:
getRequestContext().persistAndReturn(getModel()).with("actvTyp","people","pplActvRight").fire(new Receiver<M>() {
@Override
public void onSuccess(M response) {
unsetContext();
onSaveSuccess( response );
}
});
在我得到的响应中,响应 pplActvRight 已经为空,但在 getModel() 中设置了 pplActvReqProxy。
在服务器端,我有一个服务,它调用我的 DAO 的以下方法:
public ActvReq persistAndReturn(ActvReq entity){
em.getTransaction().begin();
em.persist(entity);
em.close;
return entity;
}
当我尝试使用 with("pplActvRight","people",actvType") 方法从编辑器中持久保存 ActvReqProxy 时,我没有收到任何错误,但在我的数据库中,实体并不完全持久化。我的意思是在数据库中创建了一个新的 ActvReq,但字段 PPL_ACTV_RIGHT_ID 仍然为空。(它适用于人员和 actvTyp)
编辑:实际上我假设问题位于resolveDomainValue 中的GWT Resolver 上,它无法解析pplActvRight 属性。就好像我的 EntityProxy 对象在服务器端不存在。
有什么想法吗?
【问题讨论】:
-
您确定 pplActvRight 属性在您坚持
ActvReqProxy的那一刻设置在ActvReqProxy上吗?您还可以显示持续存在的代码ActvReqProxy吗? -
好吧,只要我们在客户端,一切似乎都是正确的。但是一旦在服务器端 pplActvRight 为空。
标签: gwt jpa-2.0 requestfactory resolver