2011-08-30 8 views
5

テーブルに挿入されるエンティティに固有の番号を生成する必要があります。各数値は、エンティティの作成日とシリアル番号から構成されます。date + sn。シリアル番号は、翌日の午後にリセットする必要があります。1日中にエンティティの一意のシーケンス番号を生成します。

| 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データベースにそれは(現在、彼らはすべてのデータベースの相互作用のために使用されている)にHibernateの上にJPAを使用して行うことができ、トランザクション安全な方法で(エンティティが同時に挿入することができます)どのように?

もちろん、私は他のすべてのアプローチの説明を理解するでしょう。ありがとう。

答えて

2

挿入する前にトリガを使用できます。

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 ; 

あなただけのコメントアウト行を使用することを望んでいない場合には、8桁(または何でも)にnewdayidでの小数点以下の桁数を修正するためには良い考えかもしれないことに注意してください。

+0

それは誰もが別のエンティティの挿入を開始することはできないことを保証しますか?それ以外の場合、競合状態が可能であり、同一番号のエンティティを作成できます。 – ilya

0

@ Johan提案のようなデータベース生成値と、@Generated(GenerationTime.INSERT) Hibernate注釈拡張の使用を組み合わせて使用​​できます。

2.4.3.5. Generated properties

一部のプロパティは、あなたの データベースで挿入または更新時に生成されます。 Hibernateは、このような性質に対処し、トリガすることができます

@PrePersit

が前に実行されるこれらのプロパティ

creationDateフィールドはJPAでサポートされている@PrePersitコールバックイベントに設定することができますを読むことを選択し、その後の エンティティマネージャの永続操作は、実際には が実行またはカスケードされています。この呼び出しは、操作 の持続操作と同期しています。

例(より明確にするためのgetterとsetter 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(); 
    } 

}

関連する問題