2011-07-07 27 views
2

我正在使用JPA的EclipseLink實現,並且遇到了問題。Java JPA(EclipseLink)如何在保持實際實體之前接收下一個GeneratedValue?

這裏是我的實體類:

 
@Entity 
@Table(name = "attendances") 
public class Attendance implements Serializable {
private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id") private Short id;

....

在我的MySQL表(即底層數據存儲)我有auto_increment標誌也設置。

如何在持久化實體之前獲取自動生成的值(id字段)?因此,如果表中有3個實體(id IN (1, 2, 3)),我希望得到4作爲下一個自動生成的值。

我唯一的解決方法是:

  1. 獲取實體的ID與最大id領域。

這就是我能做的嗎?

+1

爲什麼你想這樣做? –

+0

@Nizet我有一個用於創建出席的對話框,我希望用戶知道即將創建的出席ID。這不是100%所需要的,據說是有幫助的。 –

+0

@JB Nizet:的確是一個非常有效的問題。 –

回答

0

你可以試試這個,如果使用JPA 2.0,

entityManagerFactory.getPersistenceUnitUtil().getIdentifier(attendance); 

免責聲明:從來沒有嘗試過自己。

否則,你可以改變你的id生成策略,在堅持實體之前可以得到id。例如,嘗試使用表生成器來生成您的id。在這裏,我找到了一個例子,Use Table Generator To Generate ID。然後,您將能夠直接從該表中讀取值。您可能無法使用@Id自動處理此問題,您最終將自行計算下一個id。因此,您可以採用相同的想法,但自己完成所有工作,並在創建操作時設置id,並且不要讓JPA生成該操作。

或者您可能會喜歡使用sequence(如果支持)。在sequence的情況下,您還需要自己獲取下一個值並手動設置。在沒有插入的情況下準備跳過跳過的id,或者以某種方式處理。

或者你很好,你在做什麼。只要照顧原子性。或者您可能沒有同時運行多個事務的情況。

+0

getIdentifier調用不起作用。該方法的文檔說:「返回實體的id。生成的id不能保證在數據庫插入發生之前可用,如果實體還沒有id,則返回null」 –

+0

@JB Nizet:所以我應該使用表生成器? –

+0

@JB Nizet:O'yeah,我也不保證。正如我所說,我的意思是,我從來沒有嘗試過。順便說一句,沒有保證也推斷它可能工作。無論如何,我也提出了第二個建議,OP可能會考慮這一點。 –

相關問題