2014-03-24 76 views
0

這很難說出來,但我會盡我所能。從JSON映射時,Jersey可以從ID中找到POJO?

高層:我寫一個Web服務到一個新的PrblFldr實體添加到數據庫中,但我需要正確的PrblTmplt與之相關聯(請忽略了可怕的命名方案,我沒有做到這一點) 。我在發佈JSON,Jersey將其映射到正確的POJO。但是,我不想爲其中一個字段調用POJO的構造函數,而是希望它使用EntityManager根據ID來查找正確的對象。

低等級:這裏的JSON目前我想傳遞給我的web服務的一個樣本:

{ 
    fldrNm: "test", 
    prblTmplt: { 
     tmpltSeqId: 4 
    } 
} 

下面是對對方的代碼,其中Web服務位於:

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Path("/folders/create") 
public Response createFolder(PrblFldr folder) { 
    em.persist(folder); 
    return Response.ok(gson.toJson(folder), MediaType.APPLICATION_JSON).build(); 
} 

現在,這裏的PrblFldr實體是什麼樣子,有很多不相關的領域的省略:

@Entity 
@Table(name="PRBL_FLDR") 
@NamedQuery(name="PrblFldr.findAll", query="SELECT p FROM PrblFldr p") 
public class PrblFldr implements Serializable { 

    @Expose 
    @Column(name="FLDR_NM") 
    private String fldrNm; 

    //bi-directional many-to-one association to PrblTmplt 
    @Expose 
    @ManyToOne 
    @JoinColumn(name="FLDR_TYP_SEQ_ID", insertable=false, updatable=false) 
    private PrblTmplt prblTmplt; 

    // other fields... 
} 

看看prblTmplt字段如何加入FLDR_TYP_SEQ_ID?我需要從該ID到對象。最後,這裏是我們的PrblTmplt類是什麼樣子,再次用唯一的相關信息包括:

@Entity 
@Table(name="PRBL_TMPLT") 
@NamedQuery(name="PrblTmplt.findAll", query="SELECT p FROM PrblTmplt p") 
public class PrblTmplt implements Serializable { 

    @Expose 
    @SerializedName("id") 
    @Id 
    @Column(name="TMPLT_SEQ_ID") 
    private long tmpltSeqId; 

    // other fields... 
} 

的最終目標是防止需要創建澤西映射到一些中間POJO,僅右轉身填寫新的PrblFldr對象中的相關字段(並使用em.find()實際查找我們正在使用的PrblTmplt)。我不確定我說的是否有可能,但是在找了幾個小時之後,我想我會問你們。

編輯:爲了更清楚地說明了我的情況,上面的代碼(當我登錄了什麼Web服務發送回)輸出JSON是這樣的:

{ 
    fldrNm: "test", 
    prblTmplt: { 
     tmpltSeqId: 4 
    } 
} 

...這正是我把在相反,我想那tmpltSeqId被用作查找PK來獲取與在數據庫中該ID存在的對象,所以一回可能是這個樣子:

{ 
    fldrNm: "test", 
    prblTmplt: { 
     tmpltSeqId: 4, 
     tmpltDesc: "sample description", 
     tmpltNm: "sample template name", 
     // etc... 
    } 
} 
+0

我相信Jersey正在使用JAXB從您的JSON構建實體。您可以對JAXB使用setPrblTmplt(),並使用JPA找到PrblTmplt實例,並使用它設置該字段,並讓JPA直接訪問prblTmplt屬性。另外JoinColumn(name =「FLDR_TYP_SEQ_ID」意味着「FLDR_TYP_SEQ_ID」字段是PrblTmplt.tmpltSeqId的外鍵,但你已經標記爲只讀。如果它被映射到對象的其他地方,爲什麼不使用該字段從JPA中查找PrblTmplt,而不是通過? – Chris

+0

發送部分JSON表示。考慮到'tmpltSeqId'被標記爲PK,我可以像'em.find(PrblTmplt。class,id)'來找到它。問題在於,我要麼直接解釋即將發佈的JSON,要麼創建一些中間POJO來映射。如果我能以某種方式讓Jersey自動查找並將'prblTmplt'字段映射到PrblFldr對象,我會喜歡它,基於我提供的'tmpltSeqId'。 –

+0

另外,爲什麼我打上'insertable'和'updatable'在'JoinColumn'標註爲'prblTmplt'假的原因是因爲你不應該修改(或創建)從'PrblFldr'對象的模板。該模板必須從完全不同的途徑進行修改。 –

回答

0

我決定對我原來的想法擁有一切這是自動發生的。相反,我創建了我自己的「中間實體」POJO,這是我允許JAXB映射到的。然後,我將執行自己的JPA查找並手動構建我的實際實體。回顧一下,這可能是一種更合適的方法,因爲您可以通過手動執行流程避免模棱兩可。