在一天内为实体生成唯一的序列号

时间:2011-08-30 13:54:56

标签: mysql hibernate jpa transactions sequence

我需要为插入表格的实体生成唯一的数字。每个数字包括实体创建日期和序列号:date + sn。必须在第二天开始时重置序列号。

| 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     |

如何使用JPA over Hibernate(目前它们用于所有数据库交互)和事务安全方式(实体可以同时插入)在MySQL数据库中完成?

当然,我将欣赏所有其他方法的描述。感谢。

2 个答案:

答案 0 :(得分: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 ;

请注意,将newdayid中的小数位数固定为8位数(或其他数字)可能是个好主意,如果您不想这样,只需使用注释掉的行。

答案 1 :(得分:0)

您可以使用@Johan提议的数据库生成值和@Generated(GenerationTime.INSERT) Hibernate Annotation Extensions的使用组合。

  

2.4.3.5. Generated properties

     

您的插入或更新时会生成一些属性   数据库。 Hibernate可以处理这些属性并触发一个   后续选择阅读这些属性

可以在JPA支持的@PrePersit回调事件中设置creationDate字段

  

@PrePersit

     

在实体管理器实际执行操作之前执行   执行或级联。此调用与持久性同步   操作

示例(Getter和setter省略以便更清晰)

@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();
    }

}