"不存在具有给定标识符的行",尽管它存在

roe*_*erj 26 java hibernate

我正在使用Hibernate并获取

线程"main"中的异常org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行:[#271]

这个错误的奇怪之处在于,具有给定id的对象存在于数据库中.我在有问题的应用程序运行中插入了有问题的记录.如果我在同一次运行中访问它(即相同的休眠会话),则检索数据似乎没有问题.

仅仅因为它可能是映射的错误:

public class ProblemClass implements Persistent {
  @ManyToOne(optional = false)
  private MyDbObject myDbObject;
}
public class MyDbObject implements Persistent {
  @OneToMany(mappedBy = "myDbObject")
  private List<ProblemClass> problemClasses;
  @ManyToOne(optional = false)
  private ThirdClass thirdClass;
}
Run Code Online (Sandbox Code Playgroud)

我绝对不知道哪里可以看.任何提示高度赞赏!

只是为了澄清:数据被插入到应用程序的另一个RUN中.它肯定在数据库中,因为我可以在应用程序终止后通过SQL查询看到它.在那之后,即再次启动应用程序时,我在数据库的FIRST查询中得到错误 - 没有删除,也没有涉及回滚.

另外:因为有人问过,这里是获取数据的代码:

public List<ProblemClass> getProblemClasses() {
    Query query = session.createQuery("from ProblemClass");
    return query.list();
}
Run Code Online (Sandbox Code Playgroud)

只是为了完成它,这里是插入它的通用代码(在获取应用程序的另一个RUN之前):

public void save(Persistent persistent) {
    session.saveOrUpdate(persistent);
}
Run Code Online (Sandbox Code Playgroud)

roe*_*erj 24

尤里卡,我找到了!

问题如下:

表中的数据ThirdClass未正确保留.由于此数据是从MyDbObject引用的

optional = false
Run Code Online (Sandbox Code Playgroud)

Hibernate进行了内连接,因此为连接返回一个空结果.因为如果在一个会话中执行数据(我想在缓存中),那就没有问题了.

MySQL不强制执行外键完整性,因此在插入损坏的数据时不会抱怨.

解决方案:可选=真实或正确插入数据.


Suj*_*jee 5

可能的原因:

  1. 该行由第一个会话插入,但在第二个会话尝试访问时未提交事务.
  2. 由于某种原因,第一个会话是支持滚动的.