2013-03-21 75 views
1

我正在開發彈簧數據和休眠的彈簧mvc webapp。保證與彈簧數據和休眠的唯一編號生成

我有一個由布爾型字段和整數字段組成的實體。

開始布爾字段爲false,整數字段爲空。

當布爾領域成爲真正的我需要分配到整型字段的唯一值等於MAX(SEQ)+1

要做到這一點,我寫這樣我的服務方法:

@Override 
public synchronized Obj save(Obj entry) { 
    if (entry.getBool() && entry.getSeq() == null){ 
     Integer seq = objRepository.getLastSeq(); 
     if (seq == null){ 
      seq = 1; 
     } 
     entry.setSeq(seq); 
    } 
    return entry.save(entry); 
} 

在我Reposiroty:

@Query("select MAX(seq)+1 FROM Obj") 
Integer getLastSeq(); 

我把synchronized關鍵字服務方法,以確保每次僅一個線程可以得到一個獨特的MAX + 1個..但我不知道,如果它適用於所有情況,如果它是正確的。

我可以確定它確保seq的唯一性嗎?

謝謝 馬爾科

+0

只有英國到'seq'專欄才能保證你的獨特性。 – user1516873 2013-03-21 08:34:13

+0

我無法將其設置爲UK,因爲某些實體必須具有整數值null。只有當布爾變成真時,整數才變爲非空! – gipinani 2013-03-21 08:37:38

+0

好的,用戶可以明確地調用'obj.setSeq()'? – user1516873 2013-03-21 08:46:15

回答

1

示例使用如何爲目的的初始化豆。

@Service 
public class SequenceInitializer implements InitializingBean{ 

    @Autowired 
    private ObjRepository objRepository; 

    @Autowired 
    private Service service; 

    @Override 
    public void afterPropertiesSet() throws Exception { 

     try { 
      Integer max = objRepository.getLastSeq(); 
      service.setLastSeq(max); 
     } catch(Exception e){...} 

} 

在您的服務setLastSeq將設置AtomicInteger字段。

+0

我不明白這種方法對我的情況是否有用。如果在嘗試創建實體並將其保存爲布爾值false(因此整數爲空),它可以工作嗎?然後我更新實體設置布爾真(所以integer = maxValue +1)? – gipinani 2013-03-21 10:03:35

+0

所以讓我們清楚。如果某些條件爲真,您希望有一個保存naxt整數值的字段。在您的解決方案中,每次保存實體時都會對數據庫進行額外的查詢(這不是個好主意)。在上面的解決方案中,您只在應用程序啓動時只進行一次查詢,並將最大值寫入服務中的AtomicInteger字段。現在,當下一次調用save方法時,您可以從atiomicInteger..getAndIncrement()獲取下一個整數值。該解決方案速度更快,並且同步塊已停用。 – Damian0o 2013-03-21 10:09:56

+0

在保存..或更新。 – gipinani 2013-03-21 10:30:53

2

好像你Integer是條目號或不是嗎?那麼,爲什麼不使用數據庫的序列,@id adnotation例如:

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

不..它不是實體ID。是一個整數,僅適用於布爾運算變爲true的實體。爲了更加可靠,這個實體代表一個考試..我只有在我順利通過考試時纔給出序列號!感謝您的回答 – gipinani 2013-03-21 08:35:32

+0

因此,請在回答[this](http://stackoverflow.com/questions/277630/hibernate-jpa-sequence-non-id)問題時檢查此解決方法。 – Damian0o 2013-03-21 08:49:12

+0

Meybe更好的解決方法是向您的服務添加初始化bean接口,並檢查表中的最大序列號,然後在保存方法中使用AtomicInteger。每次你想要查詢數據庫女巫的下一個整數都不是最佳解決方案。 – Damian0o 2013-03-21 08:57:09