JPAController与BigDecimal的getReference问题

时间:2011-08-23 06:17:20

标签: java jpa bigdecimal

我有一个JPAController类,它具有创建方法以在Parent和Detail Table中保存记录。主键是BigDecimal类型,在两个表中都有8个刻度和15个精度。现在我的问题是,当我调用create方法时,我得到公共T getReference(类实体类,对象主键)中的错误为BigDecimal,具有3个刻度和5个精度,如果将42.20112012作为参考键,则我得到错误,

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);
        }

感谢您的帮助......

2 个答案:

答案 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)。