Генерация уникального порядкового номера для объекта в течение одного дня - PullRequest
5 голосов
/ 30 августа 2011

Мне нужно сгенерировать уникальные номера для сущностей, вставленных в таблицу. Каждый номер состоит из даты создания объекта и серийного номера: 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 поверх Hibernate (в настоящее время они используются для всех взаимодействий с базой данных) и безопасным для транзакций способом (объекты могут быть вставлены одновременно) в базу данных MySQL?

Конечно, я буду благодарен за описания всех других подходов. Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Вы можете использовать триггер перед вставкой.

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 цифр (или что-то еще), если вы не хотитепросто используйте закомментированную строку.

0 голосов
/ 31 августа 2011

Вы можете использовать комбинацию сгенерированных в базе данных значений, таких как @Johan propose и использование @Generated(GenerationTime.INSERT) Hibernate Annotation Extensions.

2.4.3.5. Сгенерированные свойства

Некоторые свойства создаются во время вставки или обновления вашим база данных. Hibernate может иметь дело с такими свойствами и вызывает Последующее выберите, чтобы прочитать эти свойства

Поле creationDate может быть установлено в событии обратного вызова @ PrePersit , поддерживаемом JPA

@ PrePersit

Выполняется до того, как на самом деле сохранится операция управления сущностями. выполненный или каскадный. Этот вызов является синхронным с постоянным работа.

Пример (метод получения и установки для большей ясности)

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

}

...