2012-02-08 42 views
2

我需要能夠獲得一個序列號(我不介意這一代中是否有漏洞),我認爲一個SQL序列將是完美匹配。用休眠支持的JPA2創建一個序列

我正在使用Play框架,它使用由hibernate支持的JPA2。

我現在的問題是,我似乎無法讓Hibernate生成序列作爲應用程序啓動時自動ddl更新的一部分。

關於使用@SequenceGenerator的每條文檔似乎都與實體標識相關,而不是如何定義獨立於實體標識的序列。

謝謝。

編輯:只是爲了給這個問題更多的上下文,我正在做的是實施一項服務,以保持高分,第一次玩家開始遊戲,它會問服務器的訪客帳戶。

訪客帳戶的用戶名採用播放器+數字形式,如「player123123」,其中數字將從我嘗試使用的序列中生成。

當用戶註冊時,他可以將用戶名更改爲自定義的用戶名,但不能以玩家+任何形式進行更改,以便名稱空間玩家+號碼可以免費用於訪客帳戶。編輯2:現在我通過定義一個永遠不會被使用的額外的無用實體,並使用來自該實體的序列,但它是一個醜陋的黑客攻擊。

爲我的具體問題忽略可能的解決方案(黑客攻擊),我想知道hibernate和jpa2是否有可能聲明額外的(不是用於id生成的)序列與某個實體關聯或獨立於任何實體並讓hibernate自動在數據庫中創建它們。

+0

恕我直言,自動ddl更新是很有用的,當啓動一個快速n'骯髒的項目。一旦成熟,您應該擁有SQL腳本來在啓動應用程序之前自動創建模式。把這個序列創建指令放在這個腳本中。 – 2012-02-08 08:19:36

+0

現在我處於項目的快速和骯髒的階段,所以我現在不想手動維護額外的SQL腳本,現在是時候把它投入生產了,我會這樣做。 – 2012-02-08 15:52:14

+0

在數據庫中明確創建序列。 Hibernate不會知道它,所以它的自動DDL生成不會刪除它。 – 2012-02-08 17:06:13

回答

1

序列發生器(使用@SequenceGenerator定義)應是整個持久化單元唯一的,所以你可以重新使用它們。 This question處理此(或多或少)特定問題。

幾件事情要記住:

  • 序列並非所有數據庫廠商的支持,我相信Oracle和PostgreSQL的支持他們,但我不知道其他人
  • 序列發生器可對實體定義,所以你不能用一個@MappedSuperclass
  • 播放框架將自動添加和ID領域的實體,如果你擴展Model,所以記住這一點在如果您想覆蓋該行爲
+0

我正在使用PostgreSQL,所以支持不應該是一個問題。 我需要的是與此實體關聯的第二個序列,而不是用於生成ID的另一個序列。 – 2012-02-08 15:57:34

0

當您延長Model時,Play會自動向該課程添加數字id

鑑於您不介意差距,而且您只需要數字序列,因此我會建議使用id Play提供的序列作爲參考。

注意:我在這裏假設您要將該序列鏈接到可能包含更多數據的實體。如果情況並非如此,這可能無效。

+0

我不能只使用生成的Id,因爲要獲取該值,我需要先保存實體,但問題是我想使用序列爲必須唯一的字段生成數據。所以爲了保存實體我已經需要知道一個唯一的字符串作爲該字段的數據,我可以使用一個uuid或類似的東西來保存,然後在我得到id後,將值替換爲從該ID,但如果是複雜的,難以理解爲什麼我在閱讀代碼時這樣做。 – 2012-02-08 15:57:01

+0

@Ruben如果該字段僅根據id獲取其數據,則在該實體的「save」方法中爲該字段生成數據,在該數據中您將擁有該id ... – 2012-02-08 16:11:06