Вопрос

Я работаю над проектом GXT, используя JPA для сохранения, но столкнулся с проблемой сохранения двунаправленных отношений.

У меня есть эти две сущности:

    @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>();
    }

(Я не копировал геттеры и сеттеры, но эти методы существуют.)

Для сохранения 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;
    }

И когда я пытаюсь сохранить ActvReqProxy из моего редактора, используя метод with("pplActvRight","people",actvType"), я не получаю никаких ошибок, но в моей БД объект не сохраняется полностью.Я имею в виду, что в базе данных создается новый ActvReq, но поле PPL_ACTV_RIGHT_ID остается нулевым.(Он отлично работает для людей и actvTyp)

РЕДАКТИРОВАТЬ :На самом деле я предполагаю, что проблема связана с GWT Resolver вsolveDomainValue, он не может разрешить атрибут pplActvRight.Как будто мой объект EntityProxy не существует на стороне сервера.

Есть идеи?

Это было полезно?

Решение

Итак, в начале persistAndReturn на стороне сервера это уже есть null?Если так, то, по крайней мере, мы знаем, что это не имеет никакого отношения к JPA.

И вы уверены, что на стороне клиента установлено нечто иное, чем null по прокси перед звонком persistAndReturn?Вы можете легко в этом убедиться:с помощью отладчика Eclipse можно увидеть код JSON, к которому будет сериализован прокси (одно из полей прокси, которое вы можете увидеть при выборе объекта прокси в отладчике).Пожалуйста, убедитесь, что pplActvRight ключ имеет ненулевое значение.

Если да, возможно, вам следует отладить исходный код GWT, который преобразует прокси в объекты на стороне сервера, чтобы проверить, что с этим делается. pplActvRight свойство (почему ему не присвоено соответствующее ActvReq экземпляр на стороне сервера).Я не могу вспомнить, как называлось имя класса, выполнявшего эти действия, но если вы не сможете его найти, я могу поискать его для вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top