【问题标题】:HIbernate : More than one row with the given identifier was foundHIbernate : 找到了多行具有给定标识符的行
【发布时间】:2017-08-11 19:43:59
【问题描述】:
@Override
    public Application getApplicationForId(Long applicationId) {

        List<Application> applications = executeNamedQuery("applicationById", Application.class, applicationId);
        return applications.isEmpty() ? null : applications.get(0);
    }

在 eclipse 中调试时

返回 applications.isEmpty() ? null : applications.get(0);

这些表达式被评估为

applications.isEmpty() -> false

applications.get(0) -> (id=171)

applications.size() -> 1

但在执行此行之后,它的抛出错误

org.hibernate.HibernateException:找到了多行具有给定标识符的行:263536,

即使它的大小显示为 1,然后仍然是为什么以及如何在执行后获得多行。

【问题讨论】:

  • 请添加你的休眠实体类,这个问题通常发生在你急切地获取对象时。
  • 命名查询applicationById 也会有帮助。
  • 提供@GherbiHicham
  • 提供@Andreas
  • 请输入整个实体类,我们需要查看您对其余属性使用的注释,而不仅仅是id

标签: java hibernate jakarta-ee


【解决方案1】:

我很确定这是由于急切获取。所以检查你的实体并删除fetch=FetchType.EAGER

其实这不是由数据库中的重复行引起的,因为显然不可能有重复的主键。相反,这是由 Hibernate 查找对象并急切地填充关系引起的。 Hibernate 假设会返回一行,但返回两行是因为有两个对象与该关系相关联。

【讨论】:

  • 只使用了 fetch = FetchType.LAZY
【解决方案2】:

就我而言,问题是, 在事务执行过程中进行调试时,可能是目的得到服务并在执行过程中强制停止服务器,因为这已被强制停止服务器,无法导致事务回滚并且最终导致数据库中的数据变脏或损坏,因为在终止服务器之前,一些数据可能会插入到数据库中(主键自动增量的机会)。 重置表主键的 AutoIncrement 值,解决了问题。

1.识别有脏数据的表(参考堆栈跟踪)

2.对列进行排序(主键),检查列中的最大值(比如某个值)。

3.使用命令

ALTER TABLE tablename AUTO_INCREMENT = somevalue+1

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 2019-11-06
    • 2022-01-24
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多