这很难说出来,但我会尽我所能。从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'对象的模板。该模板必须从完全不同的途径进行修改。 –