我有一个JPAController类,它具有创建方法以在Parent和Detail Table中保存记录。主键是BigDecimal类型,在两个表中都有8个刻度和15个精度。现在我的问题是,当我调用create方法时,我得到公共T getReference(类实体类,对象主键)中的错误为BigDecimal,具有3个刻度和5个精度,如果将42.20112012作为参考键,则我得到错误,/ p>
Caused by: javax.persistence.EntityNotFoundException: Could not find entitiy for id: 42.201
我在JPAController Class中的create方法如下所示,我想在RuleApplGroupMst(Parent Table)和RuleGroupRelation(Detail Table)表中插入记录,
Collection<RuleGroupRelation> attachedRuleGroupRelationCollection = new ArrayList<RuleGroupRelation>();
for (RuleGroupRelation RuleGroupRelationCollectionRuleGroupRelationToAttach : RuleApplGroupMst.getRuleGroupRelationCollection()) {
RuleGroupRelationCollectionRuleGroupRelationToAttach = em.getReference(RuleGroupRelationCollectionRuleGroupRelationToAttach.getClass(),RuleGroupRelationCollectionRuleGroupRelationToAttach.getRgrSrgKey());
attachedRuleGroupRelationCollection.add(RuleGroupRelationCollectionRuleGroupRelationToAttach);
}
感谢您的帮助......
答案 0 :(得分:2)
EntityManager.getReference
依赖于主键的相等性来从数据库中获取相应的实体。当您选择BigDecimal
s作为主键时,您必须使用BigDecimal
的确切表示来获取对实体的引用。你不能使用appromixation。简单来说,按照BigDecimal的equals()
方法的定义:
将此BigDecimal与指定的Object进行相等性比较。 与compareTo不同,此方法认为两个BigDecimal对象相等 只有当它们在值和比例中相等时(因此2.0不等于 2.00用这种方法比较时。)
用作EntityManager.getReference
中的参数的主键值必须与存储的主键值和值相匹配,以便允许JPA提供程序返回引用。
因此,您应该使用与最初存储在数据库中的42.201相同的表示,以便成功检索实体。
答案 1 :(得分:1)
我得到了答案,
在My Case中,我在JPAController Class中创建了用户定义的方法,如下所示,
public void create_custom(RuleApplGroupMst RuleApplGroupMst) {
EntityManager em = null;
try {
utx.begin();
em = getEntityManager();
em.persist(RuleApplGroupMst);
utx.commit();
} catch (Exception ex) {}
然后将实体Bean中的OneToMany关系声明为
@OneToMany(cascade = CascadeType.ALL,mappedBy = "ragmSrgKey")
然后我通过托管bean调用create_custom方法。
它适用于主要/参考密钥的所有类型(包括BigDecimal)。