這很難說出來,但我會盡我所能。從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...
}
}
我相信Jersey正在使用JAXB從您的JSON構建實體。您可以對JAXB使用setPrblTmplt(),並使用JPA找到PrblTmplt實例,並使用它設置該字段,並讓JPA直接訪問prblTmplt屬性。另外JoinColumn(name =「FLDR_TYP_SEQ_ID」意味着「FLDR_TYP_SEQ_ID」字段是PrblTmplt.tmpltSeqId的外鍵,但你已經標記爲只讀。如果它被映射到對象的其他地方,爲什麼不使用該字段從JPA中查找PrblTmplt,而不是通過? – Chris
發送部分JSON表示。考慮到'tmpltSeqId'被標記爲PK,我可以像'em.find(PrblTmplt。class,id)'來找到它。問題在於,我要麼直接解釋即將發佈的JSON,要麼創建一些中間POJO來映射。如果我能以某種方式讓Jersey自動查找並將'prblTmplt'字段映射到PrblFldr對象,我會喜歡它,基於我提供的'tmpltSeqId'。 –
另外,爲什麼我打上'insertable'和'updatable'在'JoinColumn'標註爲'prblTmplt'假的原因是因爲你不應該修改(或創建)從'PrblFldr'對象的模板。該模板必須從完全不同的途徑進行修改。 –