从JSON映射时,Jersey可以从ID中找到POJO吗?

时间:2014-03-24 15:53:14

标签: java json jpa jersey eclipselink

很难说出这些,但我会尽我所能。

高级别:我正在编写一个Web服务来向数据库中添加新的PrblFldr实体,但我需要将正确的PrblTmplt与之关联(请忽略)可怕的命名方案,我没有这样做。我正在POST JSON,Jersey会映射到正确的POJO。但是,我没有为其中一个字段调用POJO的构造函数,而是希望它使用EntityManager根据ID找到正确的对象。

低级别:以下是我目前正在尝试传递给我的网络服务的JSON示例:

{
    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...
}

了解prblTmpltFLDR_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...
}

最终目标是无需创建Jersey映射到的中间POJO,只需向右转以填写新PrblFldr对象中的相关字段(以及使用em.find()实际查找我们正在使用的PrblTmplt。我不确定我说的话是否可能,但经过几个小时的搜索,我想我会问你们。

编辑:为了更清楚地指明我的情况,上面的代码(当我记录Web服务发回的内容时)输出JSON,如下所示:

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

...这正是我放入的内容。相反,我希望将tmpltSeqId用作查找PK来获取DB中存在该ID的对象,因此返回可能看起来像什么像这样:

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

1 个答案:

答案 0 :(得分:0)

我决定反对我原先想到的所有这一切都会自动发生。相反,我创建了自己的“中间实体”POJO,我允许JAXB映射到。然后,我将执行自己的JPA查找并手动构建我的实际实体。回顾过去,这可能是一种更合适的方法,因为您可以通过手动执行该过程来避免歧义。