1

永続性にJPAを使用するGXTプロジェクトに取り組んでいますが、双方向の関係の永続性に関する問題に直面しています。

私はそれらの2つのエンティティを持っています:

    @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は、私が取得した応答ではすでにnullですが、getModel()ではpplActvReqProxyが設定されています。

サーバー側では、DAOの次のメソッドを呼び出すサービスがあります。

    public ActvReq persistAndReturn(ActvReq entity){
        em.getTransaction().begin();
        em.persist(entity);
        em.close;
        return entity;
    }

また、メソッドwith( "pplActvRight"、 "people"、actvType ")を使用して、エディターからActvReqProxyを永続化しようとすると、エラーは発生しませんが、DBではエンティティが完全に永続化されていません。つまり、新しいActvReqがDBに作成されますが、フィールドPPL_ACTV_RIGHT_IDはnullのままです(人とactvTypで正常に機能します)

編集:実際、問題はresolveDomainValueのGWTリゾルバーにあると思いますが、属性pplActvRightを解決できません。EntityProxyオブジェクトがサーバー側に存在しないかのようです。

何か案は?

4

1 に答える 1

0

それで、persistAndReturnサーバー側の最初にそれはすでにnullですか?もしそうなら、少なくとも私たちはそれがJPAとは何の関係もないことを知っています。

nullそして、クライアント側では、呼び出す前にプロキシ以外のものに設定されていると確信していますpersistAndReturnか?簡単に確認できます。Eclipseデバッガーを使用すると、プロキシがシリアル化されるJSONコードを確認できます(デバッガーでプロキシオブジェクトを選択したときに表示されるプロキシのフィールドの1つ)。pplActvRightキーがnull以外の値で存在することを確認してください。

その場合は、プロキシをサーバー側のエンティティに変換するGWTソースコードをデバッグして、そのプロパティで何が行われているのかを確認する必要があります(対応するサーバー側のインスタンスpplActvRightに割り当てられていないのはなぜですか)。ActvReqこのようなことをしているクラス名が何であったかは思い出せませんが、見つからない場合は検索できます。

于 2012-07-27T07:26:58.257 に答える