Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT RequestFactory:更新未传播到级联对象_Gwt_Jpa_Requestfactory - Fatal编程技术网

GWT RequestFactory:更新未传播到级联对象

GWT RequestFactory:更新未传播到级联对象,gwt,jpa,requestfactory,Gwt,Jpa,Requestfactory,我有一个实体公司,有一个被引用的对象ItemVersion,我使用JPA(eclipselink)作为持久层。此处给出了代码摘录: @Entity public class Company{ private String instance; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "fk_item_version_id") private ItemVersion itemVersion; }

我有一个实体公司,有一个被引用的对象ItemVersion,我使用JPA(eclipselink)作为持久层。此处给出了代码摘录:

@Entity
public class Company{
    private String instance;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "fk_item_version_id")
    private ItemVersion itemVersion;
}

@Entity
public class ItemVersion{
    private String comment;
...
}
我可以创建一个公司对象并将其持久化。我还可以找到新对象,更新属性“instance”并将其持久化,一切正常。 当我更改引用的ItemVersion对象的属性“comment”时,此更改不会存储在服务器端

创建/更新测试代码如下所示:

final EventBus eventBus = new SimpleEventBus();
final AftdRequestFactory requestFactory = GWT.create(AftdRequestFactory.class);
requestFactory.initialize(eventBus);

final CompanyRequest request = requestFactory.companyRequest();
final CompanyProxy newCompany = request.create(CompanyProxy.class);
newCompany.setInstance("1");
ItemVersionProxy newVersion = request.create(ItemVersionProxy.class);
newVersion.setComment("first comment");
newCompany.setItemVersion(newVersion);

request.persist().using(newCompany).fire(new Receiver<Void>() {
    @Override
    public void onSuccess(Void arg0) {
    final CompanyRequest request2 = requestFactory.companyRequest();
    Request<CompanyProxy> p = request2.findCompany(1L).with("itemVersion");
    p.to(new Receiver<CompanyProxy>() {
        @Override
        public void onSuccess(CompanyProxy response) {
            final CompanyRequest request3 = requestFactory.companyRequest();
            final CompanyProxy editableCompany2 = request3.edit(response);
            editableCompany2.setInstance("2");
            editableCompany2.getItemVersion().setVersionNumber(2);
            request3.persist().using(editableCompany2).fire(new Receiver<Void>() {
                @Override
                public void onSuccess(Void arg0) {
                    // persist company version
                    System.out.println("company updated");
public void persist() throws PersistenceException {
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = null;
    try {
        tx = em.getTransaction();
        tx.begin();
        Company existingEntity = findCompany(getId());
        if (existingEntity == null) {
            em.persist(this);
        } else {
            setId(existingEntity.getId());
            em.merge(this);
        }
        tx.commit();
    } catch (RuntimeException e) {
        tx.rollback();
        throw e;
}

使用搜索和em.persist或em.merge的解决方案取决于搜索结果,这是必要的,因为简单的persist不会存储任何更新。

您必须使用视图中打开的会话/每个请求的会话模式(即在请求的生存期内共享相同的
EntityManager
实例)与工厂合作;有关详细信息,请参阅。

您是否在服务器端使用then OpenSessionInView(即每个请求的会话)模式?(或者换句话说,您是如何管理JPA
EntityManager
s的生命周期的?)我在上面添加了Company.persist()代码。我还认为问题的根本原因在于服务器端。根据我的理解,我应该看到更新的对象,包括Company.persist()中所有更新的引用,但正如我所说的,我只看到Company的更新,而不是ItemVersion的更新。现在,我还没有找到任何完整的源代码示例,它结合使用RequestFactory和JPA。你能提供一个链接吗?非常感谢。对,这就是问题所在。使用相同的EntityManager实例解决了这个问题。非常感谢。