2011-12-21 191 views
9

我用Hibernate做了一個示例應用程序。我的要求是桌子上沒有主鍵。我只需要從應用程序中選擇查詢。我知道應該有一個主鍵,但我所指的桌子卻沒有它。沒有主鍵休眠

它有大約50K記錄。所以,修改表格以添加ID列沒有看到可行的選項。

它有可能嗎?

回答

22
  1. Hibernate requires that entity tables have primary keys.故事結束。
  2. 當你談論數據庫時,50k記錄根本就不是那麼多。

我的建議:在表中添加一個自動增量整數PK列。你會對它的速度感到驚訝。

+3

在沒有觸及你的數據庫表的情況下,在這裏提到的答案[Hibernate和沒有PK作品](http://stackoverflow.com/questions/767277/hibernate-and-no-pk)。這是Hibernate實際上不檢查重複的一個例子。 – Sankalp 2014-02-05 12:45:28

8

因此,修改表中添加ID列沒有看到可行的選項。

這是爲什麼?你的意思是,因爲它已經有五萬條記錄?相信我,那真的不是很多。


即使表不具有代理鍵,並沒有一個主鍵約束,即使你不願意修改表,但仍可能有某種candidate key —也就是說,一些永遠不爲空的列集合,其值唯一標識一條記錄。即使不修改表來強制其唯一性和非無效性,您可以告訴Hibernate這些列形成composite ID

+3

這是一個很好的答案,但要備份操作系統,有很多情況下,無法更改表格並「正確」。例如,客戶向我們提供了一個創建的視圖,該視圖不包含ID,不包含主鍵,在許多情況下還包含重複的行。非常沮喪,但它發生。 – cbmeeks 2013-04-18 20:04:24

+1

舊的線程,但即時通訊仍然在谷歌上找到它。值得一提的是,在企業環境中工作時,由於您不能用您選擇的orm框架查詢它,您無法證明向具有巨大吞吐量和數百萬行的表添加額外列是合理的......您只需要解決它。 – cowls 2014-04-03 08:15:26

0

我找到了沒有主鍵和空值爲表的解決方案。它將在oracle數據庫上運行。也許其他數據庫存在類似的情況。

  1. 您應該創建在POJO類新的主鍵:

    @Id @Column(name = 「ID」) 私人整數ID;

,並使用createNativeQuery這樣

getEntityManager().createNativeQuery("select rownum as id, ..... 

本機查詢將生成主鍵,你會得到獨特的效果。