2017-08-11 54 views
1
@Override 
    public Application getApplicationForId(Long applicationId) { 

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

而在蝕休眠:多個行具有給定標識符發現

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

這些表達得到評價爲

applications.isEmpty() - >假

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

應用.size() - > 1

但執行後o F該行其投擲的錯誤

org.hibernate.HibernateException:多行與指定的標識符發現:263536,

即使其大小顯示爲1,則仍然爲什麼和如何得到它執行後多行。

+0

請添加您的休眠實體類,這個問題通常,當你急切地獲取對象發生。 –

+0

命名查詢'applicationById'也是有幫助的。 – Andreas

+0

提供 @GherbiHicham – MAX

回答

1

我很確定這是由於渴望提取。所以檢查你的實體並刪除fetch=FetchType.EAGER

其實這是而不是由數據庫中的重複行引起的,因爲它顯然不可能有重複的主鍵。相反,這是由於Hibernate查找一個對象,並且迫切地填充關係造成的。 Hibernate假定一行會返回,但是有兩個返回,因爲有兩個對象與該關係相關聯。

+1

僅用於fetch = FetchType.LAZY – MAX

0

在我的情況下,當執行在事務中間時調試時,問題是 ,可能是服務器在執行本身中間被強制停止服務的目的,因爲它已被強制停止服務器,它不能導致事務回滾,並最終導致數據在數據庫中變髒或損壞,因爲在終止服務器之前,可能會在db中插入一些數據(自動增加主鍵的機會)。 重置表的主鍵的AutoIncrement值,解決了問題。

1.識別與髒數據的表(參照堆棧跟蹤)

2.SORT列(主鍵),檢查該列中的最高值(比方說someValue中)。

3.使用命令

ALTER TABLE tablename AUTO_INCREMENT = somevalue+1 
相關問題