2017-01-30 63 views
0

我正在使用JPA和Hibernate連接到表並將數據插入到同一個表中。我有一個表格說:有三列ID,名稱和地址的用戶。我有一個相同的實體類,並插入數據,我只是簡單地使用EntityManager的對象,並堅持在數據庫中的數據,這對我來說就像一個魅力。在插入行之前驗證Postgres表中的現有值

現在我有一個場景,我想檢查我持久化的值是否已經存在,如果是這種情況我必須記錄一個錯誤。目前我如何做是手動加載表中的行,並手動檢查是否存在相同的值,這對於只有三列的示例表(User)來說相當簡單。但是如果我有一張30列的桌子呢?

我是否根據一個條件手動加載數據並檢查其他列,或者有更好的方法可以做到嗎?

+2

使用表約束,不允許重複的行。 – Kayaman

+0

+1給@Kayaman,使用Db約束。 否則sql/hql查詢是唯一的選擇。 –

+0

查找表格的唯一子列併爲每個列應用約束。 - 爲了保持你的榜樣,比方說,我們有一個用戶表,有一堆列。你想要允許2個不同的行在'email'列是相同的,但是讓我們說'favourite_color'是不同的。 – pozs

回答

0

30列,是你主鍵爲?如果要檢查重複的數據是主鍵還是唯一約束,則可以在保存之前使用Hibnerate獲取對象,並在其存在時報告回來。如果30列不是鍵的一部分,那麼我會使用equals方法,並因此獲取所有行。但是,如果有很多行,這將是緩慢的話,我可能會寫一個專用的SQL查詢的地方對象存在,即

UserDao public boolean rowExists(User user) { ... }

+0

不幸的是,我們需要檢查的30列不是關鍵的一部分,這使得它很棘手。使用您的解決方案,問題是我們不必檢查全部30列,但可能是25列 –

+0

這是一個非常差的通用解決方案。如果沒有表約束,任何簡單的多線程代碼都將能夠插入重複項,除非您大量使用序列化事務。 – Kayaman

+1

@AnkushBhan:你總是可以在這些列上創建一個唯一的索引 - 但有30列應該是獨一無二的,對我來說聽起來像是一個奇怪的要求。 –

相關問題