2014-09-04 187 views
6

我有一個應該從數據庫中自動獲取id的實體。我使用MySQL,所以我期望註釋@GeneratedValue(strategy=GenerationType.AUTO)將在幕後解析爲IDENTITY,而不是SEQUENCE。但是,當我嘗試堅持一個新的實體時,它失敗,說沒有找到hibernate_sequence。它顯然使用序列策略而不是身份。JPA @GeneratedValue(strategy = GenerationType.AUTO)不適用於MySQL

我已經在persistence.xml設置方言:org.hibernate.dialect.MySQL5InnoDBDialect

Hibernate的版本4.2.0.CR1

所有我讀說,連接到MySQL,支持自動當它應該使用的身份源戰略。

+1

安置自己的實體? – CycDemo 2014-09-04 15:11:44

回答

6

如果您使用的是增強型的標識符:

properties.put("hibernate.id.new_generator_mappings", "true"); 

then the SequenceStyleGenerator is used,由於MySQL不支持序列it will fall-back to TABLE generator。這就是爲什麼它尋找「hibernate_sequence」,這是默認的序列表名稱。

如果你不使用新的發電機,那麼「天然」生成策略被使用,這會尋找:

public Class getNativeIdentifierGeneratorClass() { 
    if (supportsIdentityColumns()) { 
     return IdentityGenerator.class; 
    } 
    else if (supportsSequences()) { 
     return SequenceGenerator.class; 
    } 
    else { 
     return TableHiLoGenerator.class; 
    } 
} 

因此,它從選擇:

  • 身份
  • 序列
  • 希洛

取決於您當前的數據庫功能。

在這種情況下,MySQL將始終挑選身份。欲瞭解更多詳情,check out this article

1

AUTO意味着讓它達到JPA實現(請參閱JPA規範)。 IDENTITY表示如果RDBMS支持它(mySQL),則使用自動增量功能。 具體(使用IDENTITY),它會起作用。如果您曾移動到具有不同邏輯的「AUTO」的不同JPA實施方案,則此優點更具優勢。

0

您可以在實體Bean中使用@GeneratedValue(strategy = GenerationType.IDENTITY)。 它在sql數據庫上工作。 但是,在您調用em.persist(您的實體)後,該實體不會獲得該ID。所以你需要在該實體上調用em.refresh。

0
@Id 
@GeneratedValue(
    strategy= GenerationType.AUTO, 
    generator="native" 
) 
@GenericGenerator(
    name = "native", 
    strategy = "native" 
) 

使用這種發電機=「本地」 作爲數據庫不支持序列

相關問題