0

我有两个表之间的 OneToOne 关系,如下所示:

PreRecordLoad.java:

@OneToOne(mappedBy="preRecordLoadId",cascade = CascadeType.ALL)
private PreRecordLoadAux preRecordLoadAux;

PreRecordLoadAux.java:

@JoinColumn(name = "PRE_RECORD_LOAD_ID", referencedColumnName = "PRE_RECORD_LOAD_ID")
@OneToOne
private PreRecordLoad preRecordLoadId;

我正在使用这种方法来拉回 PreRecordLoad 对象:

public PreRecordLoad FindPreRecordLoad(Long ID)
{
    print("Finding " + ID + "f");

    Query query;
    PreRecordLoad result = null;
    try
    {
        query = em.createNamedQuery("PreRecordLoad.findByPreRecordLoadId");
        query.setParameter("preRecordLoadId", ID);
        result = (PreRecordLoad)query.getSingleResult();
        //result = em.find(PreRecordLoad.class, ID);
    }
    catch(Exception e)
    {
        print(e.getLocalizedMessage());
    }

    return result;
}

'+ "f"' 用于查看传递的值是否以某种方式结尾。它没有。

我最初使用 em.find,但无论我使用哪种方法都会出现同样的问题。

我曾经使用 BigDecimal 作为 ID,因为它是默认值,并且注意到当它工作和不工作时我得到了精度差异。具体来说,当它不起作用时精度为 4,但当它起作用时精度为 0。我不知道为什么会这样,所以我将 BigDecimal 更改为 Long,因为无论如何我从来不需要它成为 BigDecimal。

当我将新的 PreRecordLoad 和 PreRecordLoadAux 对象保存到数据库(第一次插入它们),然后尝试运行此方法来调用对象时,它检索 PreRecordLoad,但 PreRecordLoadAux 为空。尽管该条目位于数据库中并且看起来已完全提交,因为我可以从 SQLDeveloper 访问它,这是一个单独的会话。

但是,如果我停止并重新运行应用程序,那么它会成功拉回两个对象。两次传递的 ID 都是相同的,或者至少看起来是相同的。

无论如何建议将不胜感激,谢谢。

编辑:

这是我将对象持久保存到数据库中的代码:

    if(existingPreAux==null) {
        try {
            preLoad.setAuditSubLoadId(auditLoad);
            em.persist(preLoad);
            print("Pre Record Load entry Created");

            preAux.setPreRecordLoadId(preLoad);
            em.persist(preAux);
            print("Pre Record Load Aux entry Created");
        }
        catch(ConstraintViolationException e) {
            for(ConstraintViolation c : e.getConstraintViolations()) {
                System.out.println (c.getPropertyPath() + " " + c.getMessage());
            }
        }
    }
    else {
        try {
            preLoad.setPreRecordLoadId(existingPreLoad.getPreRecordLoadId());
            preLoad.setAuditSubLoadId(auditLoad);
            em.merge(preLoad);
            print("Pre Record Load entry found and updated");

            preAux.setPreRecordLoadAuxId(existingPreAux.getPreRecordLoadAuxId());
            preAux.setPreRecordLoadId(preLoad);
            em.merge(preAux);
            print("Pre Record Load Aux entry found and updated");
        }
        catch(ConstraintViolationException e) {
            for(ConstraintViolation c : e.getConstraintViolations()) {
                System.out.println (c.getPropertyPath() + " " + c.getMessage());
            }
        }
    }

那是在一个方法中,在该代码之后,该方法结束。

4

1 回答 1

1

维护对象图的连贯性是您的责任。所以,当你做preAux.setPreRecordLoadId(preLoad);的时候,你也必须做preLoad.setPreRecordLoadAux(preAux);

如果你不这样做,那么每次你preAux从同一个会话中加载时,它都会从一级缓存中检索出来,从而返回你错误初始化的实体实例。

于 2013-07-16T13:23:49.163 回答