我有两个表之间的 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());
}
}
}
那是在一个方法中,在该代码之后,该方法结束。