2014-03-24 45 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查找并手动构建我的实际实体。回顾一下,这可能是一种更合适的方法,因为您可以通过手动执行流程避免模棱两可。