2010-05-17 69 views
25

我使用Hibernate和越來越「與給定的標識符的行存在」,但它確實存在

異常線程「main」 org.hibernate.ObjectNotFoundException:與給定的標識符的行存在:[# 271]

這個錯誤的奇怪之處在於,具有給定標識的對象存在於數據庫中。我在應用程序的另一個運行中插入了有問題的記錄。如果我在同一次運行中訪問它(即相同的休眠會話),檢索數據似乎沒有問題。

只是因爲它可能是映射的故障:

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中。這絕對是在數據庫中,因爲我可以在應用程序終止後通過SQL查詢來查看它。在THAT之後,即再次啓動應用程序時,我在數據庫的FIRST查詢中收到錯誤 - 不刪除,不涉及回滾。

增加: 因爲有人問,這裏是獲取數據的代碼:

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

而這只是爲了完整,這裏是通用的代碼,將其插入(在另一個運行在讀取前該應用程序):

public void save(Persistent persistent) { 
    session.saveOrUpdate(persistent); 
} 

回答

21

尤里卡,我找到了!

問題是以下幾點:不正確地持久

表中ThirdClass的數據。由於該數據是從經由MyDbObject

optional = false 

引用休眠製成的內部加入,從而返回的加入空的結果。因爲如果數據在一個會話中執行(我想是在緩存中),那沒有任何問題。

MySQL不強制執行外鍵完整性,因此不會抱怨插入損壞的數據。

解決方案:可選=真或正確插入數據。

+7

使用InnoDB表格... – 2010-05-17 10:09:14

+0

非常感謝您發佈答案! – Lisa 2013-10-25 04:08:49

2

聽起來像您的交易插入被rollbacked

+0

對不清楚:數據被插入到應用程序的另一個RUN中。這絕對是在數據庫中,因爲我可以在應用程序終止後通過SQL查詢來查看它。在那之後,我在數據庫的第一個查詢中得到錯誤。 – roesslerj 2010-05-17 08:08:22

5

可能的原因:

  1. 該行由第一個會話插入,但事務在第二個會話嘗試訪問時未提交。
  2. 由於某種原因,第一次會議是回滾支持的。
+0

也很抱歉不清楚:數據被插入應用程序的另一個RUN中。這絕對是在數據庫中,因爲我可以在應用程序終止後通過SQL查詢來查看它。在那之後,我在數據庫的第一個查詢中得到錯誤。 – roesslerj 2010-05-17 08:09:24

0

下面給出的請更新您的hibernate配置文件:

property start tag name="hbm2ddl.auto" create/update property close tag 
1

這可能是你的情況,請檢查另一個帖子我的答案。

https://stackoverflow.com/a/40513787/6234057

我有同樣的Hibernate例外。

經過一段時間的調試後,我意識到問題是由孤兒子記錄引起的。

許多人抱怨,當他們搜索記錄時,它的存在。 我意識到這個問題不是因爲記錄的存在,而是因爲hibernate沒有在表格中找到它,而是因爲孤兒孩子的記錄。

這些記錄涉及到不存在的父母!

我所做的是找到對應於鏈接到Bean的表的外鍵引用。

要查找SQL開發人員

1.Save下面的XML代碼到一個文件中(fk_reference.xml)

<items> 
<item type="editor" node="TableNode" vertical="true"> 
<title><![CDATA[FK References]]></title> 
<query> 
    <sql> 
     <![CDATA[select a.owner, 
         a.table_name, 
         a.constraint_name, 
         a.status 
       from all_constraints a 
       where a.constraint_type = 'R' 
         and exists(
          select 1 
          from all_constraints 
          where constraint_name=a.r_constraint_name 
            and constraint_type in ('P', 'U') 
            and table_name = :OBJECT_NAME 
            and owner = :OBJECT_OWNER) 
          order by table_name, constraint_name]]> 
    </sql> 
</query> 
</item> 

2.增加用戶定義的外鍵引用擴展到SQL Developer

要找到孤立記錄中所有提到的表

SELECT * FROM CHILD_TABLE 其中FOREIGNKEY不在(選擇PARENT_TABLE的PrimaryKey) ;

刪除這些孤立記錄,提交更改並根據需要重新啓動服務器。

這解決了我的例外。你可以嘗試相同的。

2

後面這個問題的主要原因是數據不匹配,例如我有實體映射類稱爲「X」,它有列「列1」,它具有參考表中「Y」列「列1」,如下

@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "column1", referencedColumnName = "column1") 
public Y getColumn1() { 
    return Y; 
} 

在此如果X表column1有值但Y表column1沒有值。這裏的鏈接將失敗。

這是我們將得到休眠objectNotFound例外

這個問題也可以通過創建,如創建適當的索引和約束(主鍵/外鍵)合適的數據模型來解決的原因..

0

我發現在Oracle中,這個問題也可能是由權限問題導致的。由MyDbObject實例引用的ProblemClass實例可能存在,但具有不允許當前用戶查看它的權限,即使用戶可以看到當前的MyDbObject。

相關問題