gpt4 book ai didi

java - 一对一关系并不总是有效

转载 作者:行者123 更新时间:2023-12-01 14:20:09 25 4
gpt4 key购买 nike

我在两个表之间有 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(这是一个单独的 session )访问它。

但是,如果我停止并重新运行应用程序,那么它会成功拉回这两个对象。传递的 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());
}
}
}

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

最佳答案

您有责任维护对象图的一致性。因此,当您执行 preAux.setPreRecordLoadId(preLoad); 时,您还必须执行 preLoad.setPreRecordLoadAux(preAux);

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

关于java - 一对一关系并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17674847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com