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

Mysql 在一天内为实体生成唯一序列号,mysql,hibernate,jpa,transactions,sequence,Mysql,Hibernate,Jpa,Transactions,Sequence,我需要为插入到表中的实体生成唯一的编号。每个编号由实体创建日期和序列号组成:日期+序列号。序列号必须在第二天开始时重置 | id | creation date | unique number | -------------------------------------- | 1 | Sep 1, 2010 | 201009011 | | 2 | Sep 1, 2010 | 201009012 | | 3 | Sep 2, 2010 | 201009021

我需要为插入到表中的实体生成唯一的编号。每个编号由实体创建日期和序列号组成:日期+序列号。序列号必须在第二天开始时重置

| 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数据库中使用JPA over Hibernate(目前它们用于所有数据库交互)和事务安全的方式(可以同时插入实体)来实现这一点


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

您可以在插入前使用触发器

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位(或其他任何数字)可能是一个好主意,如果您不想这样做,只需使用注释掉的行。

您可以结合使用数据库生成的值,如@Johan propose和使用
@generated(GenerationTime.INSERT)
Hibernate注释扩展

某些属性是由用户在插入或更新时生成的 数据库Hibernate可以处理这些属性并触发 后续选择以读取这些属性

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

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

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