2011-07-18 63 views
1

我已經和實體兩個字段的ID和因此代碼的代碼......JPA:基於自動遞增的ID

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id") 
private Integer id; 

@Basic 
@Column(name = "code", nullable = false) 
private String code; 

我想什麼做的是,產生該代碼基於自動遞增的ID(使用Mysql作爲數據庫)。

有沒有一種方法不使用表來生成代碼列的鍵。 即

  • ID = 1級的代碼是M-000-1
  • ID = 2碼是M-000-2等。

我已成功地做到這一點的唯一方法是使用下面的腳本。我不太確定的是正確的方法。

getEntityManager().persist(myEntity); 
getEntityManager().flush(); 
myEntity.setCode(myEntity.getCode()+myEntity.getId()); 
getEntityManager().merge(myEntity); 

在此先感謝! Dimitri

回答

1

看起來不錯。您可以將其移至@PostPersist處理程序。

0

您可以用@PostPersist嘗試:

class EntityClass { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Integer id; 

    @Basic 
    @Column(name = "code") 
    private String code; 

    @PostPersist 
    public void generateCode() { 
     code = ("M-000-" + id); 
    } 
} 
+0

這種感覺不是一種很好的方法。當你進行合併時會發生什麼?然後你將在DB和持久層中有不同的ID .. – Marthin

+0

由於ID是主鍵,它會在持續時間內生成一次;之後,它不會改變。你能否提供關於你的合併案例的更多細節? –

+0

我的歉意,我誤解了原來的問題(我認爲DB中的id是代碼)。我現在同意你的解決方案。抱歉佔用你的時間。 – Marthin

1

您可以使用該@GenericGenerator註釋自定義序列發生器。這是特定於Hibernate,但已知在JPA中工作。

@Id 
@GeneratedValue(generator="custom-code-generator") 
@GenericGenerator(name="custom-code-generator", strategy = "classname-of-generator", 
parameters={...annotated parameters like the sequence name can be specified here ...}) 
@Column(name = "id") 
private Integer id; 

的策略是在實現PersistentIdentifierGenerator接口的類來實現,如API文檔中指出,自發電機也將實現Configurable接口,以允許發生器的結構。

使用@PostPersist註釋也將起作用,因爲在刷新EntityManager或者與EntityManager關聯的事務被提交之前,Id不會刷新到數據庫。