以下是很多我认为很简单的文章。问题的根源是我的无知,而不是过多地寻找代码,而是提供建议。
表:使用旧实体映射的Ininvhst(库存模式库存历史记录)列ihtran(库存历史记录转移代码)我有:
@Basic(optional = false)
@Column(name = "IHTRAN")
private String ihtran;
ihtran实际上是表Intrnmst(包含“转移代码”列表的“ Inventory Transfer Master”)的外键。这没有在数据库中表示出来,因此对Ininvhst重新生成的JPA2实体类施加了引用约束:
@JoinColumn(name = "IHTRAN", referencedColumnName = "TMCODE", nullable = false)
@ManyToOne(optional = false)
private Intrnmst intrnmst;
现在以前,我使用JPA2从Ininvhst表中选择记录/(Ininvhst实体),其中“ ihtran”是一组值之一。我使用in.value()来做到这一点...这是一个片段:
cq = cb.createQuery(Ininvhst.class);
...
In<String> in = cb.in(transactionType); //Get in expression for transacton types
for (String s : transactionTypes) { //has a value
in = in.value(s);//check if the strings we are looking for exist in the transfer master
}
predicateList.add(in);
我的问题是Ininvhst曾经包含一个名为ihtran的字符串,但是现在它包含Ininvhst ...所以我现在需要一个路径表达式:
this.predicateList = new ArrayList<Predicate>();
if (transactionTypes != null && transactionTypes.size() > 0) { //list of strings has some values
Path<Intrnmst> intrnmst = root.get(Ininvhst_.intrnmst); //get transfermaster from Ininvhst
Path<String> transactionType = intrnmst.get(Intrnmst_.tmcode); //get transaction types from transfer master
In<String> in = cb.in(transactionType); //Get in expression for transacton types
for (String s : transactionTypes) { //has a value
in = in.value(s);//check if the strings we are looking for exist in the transfer master
}
predicateList.add(in);
}
是否可以将ihtran以及均引用为“ IHTRAN”的连接列添加回实体中?还是应该使用投影以某种方式返回Ininvhst以及现在属于Intrnmst实体的ihtran字符串。或者我应该使用投影返回Ininvhst并以某种方式限制Intrnmst只是ihtran字符串。
进一步的信息:我在Web应用程序中使用选定的Ininvhst对象的结果列表,包含Ininvhst对象列表的类被转换为json对象。可能有很多序列化方法可以在对象图上导航,问题是我当前的提取策略是惰性的,因此它命中了连接实体(Intrnmst intrnmst),并且此时没有实体管理器可用。在这一点上,我已经阻止对象序列化连接列,但是现在我缺少了关键数据。
我想我说的太多了,但是我了解的不够多,我不知道您的JPA专家需要什么。我想要的是我的原始对象同时具有字符串对象和能够连接到同一列(ihtran),但是如果这不可能或不建议这样做,我想听听我应该做什么以及为什么。
伪代码/英文绰绰有余。
最佳答案
我可以将ihtran重新添加到实体中吗
以及同时是两个的连接列
引用“ IHTRAN”?
是。只需将其中一个设为只读(insertable / updateable = false)
如果使用的是EclipseLink,则还可以为外键添加QueryKey。
如果在序列化之前访问该关系,则它将可用。否则,将其设为EAGER,或将其加入您的查询中。