2011-08-30 18 views
5

Tabloya eklenen varlıklar için benzersiz numaralar oluşturmam gerekiyor. Her sayı, varlık oluşturma tarihinden ve seri numarasından oluşur: date + sn. Seri numaraları, bir sonraki günün başında sıfırlanmalıdır.Bir gün boyunca varlık için benzersiz sıra numarası oluştur

| id | creation date | unique number | 
-------------------------------------- 
| 1 | Sep 1, 2010 | 201009011  | 
| 2 | Sep 1, 2010 | 201009012  | 
| 3 | Sep 2, 2010 | 201009021  | 
| 4 | Sep 2, 2010 | 201009022  | 

MySQL veritabanında o (şu anda hepsi veritabanı etkileşimleri için kullanılır) hazırda üzerinde JPA kullanarak yapılabilir ve işlem güvenli bir şekilde (birim aynı anda eklenebilir) nasıl?

Elbette, diğer tüm yaklaşımların açıklamalarını takdir edeceğim. Teşekkürler.

cevap

2

Eklemeden önce bir tetikleyici kullanabilirsiniz. Eğer sadece dışarı yorumladı hattını kullanmak, bunu istemiyorum eğer, 8 basamak (ya da herneyse) için newdayid içinde ondalık basamak sayısını düzeltmek için iyi bir fikir olabileceğini

DELIMITER $$ 

CREATE TRIGGER bi_table1_each BEFORE INSERT ON table1 FOR EACH ROW 
BEGIN 
    DECLARE creationdate DATE; 
    DECLARE newdayid INTEGER; 

    SET creationdate = new.`creation date`; 
    SELECT count(*) + 1 INTO newdayid FROM table1 
    WHERE table1.`creation date` = creationdate; 

    -- NEW.`unique number` = CONCAT(DATE_FORMAT(creationdate,'%Y%m%d'),newdayid); 
    NEW.`unique number` = CONCAT(DATE_FORMAT(creationdate,'%Y%m%d') 
           RIGHT(CONCAT('00000000',newdayid),8)); 

END $$ 

DELIMITER ; 

Not.

+0

bu kimse başka bir varlık ekleme başlayabilir garanti mi? Aksi halde yarış durumu mümkündür ve aynı sayıya sahip varlıklar oluşturulabilir. – ilya

0

@Johan önerisi ve @Generated(GenerationTime.INSERT) Hazırda Bekletme Ek Açıklamaları'nın kullanılması gibi bir veritabanı oluşturulmuş değer kombinasyonu kullanabilirsiniz. senin veritabanı tarafından

2.4.3.5. Generated properties

bazı özellikleri ekleme veya güncelleme sırasında oluşturulur

. Hazırda böyle özelliklere başa ve tetikler bir

@PrePersit

önce Gerçekleştirilen bu özellikleri

creationDate alan JPA tarafından desteklenen @PrePersit geri arama durumunda ayarlanabilir okumak için seçme müteakip varlık yöneticisi sürdürme işlemi aslında yürütüldü veya basamaklandırıldı. Bu çağrı, islemi ile senkronize.

Örnek (Alıcı ve daha iyi anlaşılması için ayarlayıcı ommit)

@Entity 
public class Entity{ 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id; 

    @Generated(GenerationTime.INSERT) @Column(insertable = false) 
    private String uniqueNumber; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date creationDate 

    @PrePersist 
    public void prePersit() 
    { 
     creationDate = new Date(); 
    } 

}

İlgili konular