У меня есть организация под названием "Бронирование", у которой есть сгенерированное поле идентификатора, которое я использую в качестве первичного ключа. Он работает нормально. Я хочу добавить другое поле, uuid, которое я буду использовать в качестве идентификатора ресурса в REST API. У меня есть Postgres DB и настроено поле для автоматического создания:
uuid character varying(36) not null default uuid_generate_v1mc()
При создании БД генерирует id и uuid просто отлично, но в коде Java поле uuid равно null. Мой объект выглядит следующим образом:
@Entity
public class Booking {
@Id
@SequenceGenerator(name="booking_id_seq", sequenceName="booking_id_seq", allocationSize=1)
@GeneratedValue(strategy= GenerationType.IDENTITY, generator = "booking_id_seq")
private Long id;
@Column(nullable = false)
private String uuid;
(...)
}
Что я делаю неправильно?
Последующие действия: Спасибо всем за комментарии и ответы. Похоже, у меня есть два варианта: либо перезагрузить сущность из БД, чтобы получить uuid, сгенерированный БД, либо сгенерировать его сам в коде. Какой из них предпочтительнее? Думаю, последний более результативен, но есть ли что-нибудь еще?
вы можете выполнить заполнение с помощью @PrePersist в классе сущности
@PrePersist
public void autofill() {
this.setUuid(UUID.randomUUID().toString());
}
Я создал пример проекта для вашего вопроса https://github.com/zz-chen/Sample-spring-data-jpa-generate-uuid
вы можете запустить его с помощью команды
gradle bootRun
и вы получите сообщение вроде этого
2017-06-26 11:12: 16.118 INFO 78681 --- [main] hello.Application: Клиент найден с findOne (1L): 2017-06-26 11:12: 16.119 INFO 78681 --- [main] привет. Приложение: -------------------------------- 2017-06-26 11:12: 16.120 INFO 78681 --- [ main] hello.Application: Customer [id = 1, firstName = 'Jack', lastName = 'Bauer', uuid = '44969325-c31f-4b8e-96d6-a59ff9b845b6'] 2017-06-26 11:12: 16.122 INFO 78681 --- [main] hello.Application: 2017-06-26 11:12: 16.122 INFO 78681 --- [main] hello.Application
: Клиент найден с помощью findByLastName ('Bauer'): 2017-06-26 11:12: 16.122 INFO 78681 --- [main] hello.Application
: -------------------------------------------- 2017-06-26 11:12: 16.158 INFO 78681 --- [main] hello.Application
: Клиент [id = 1, firstName = 'Jack', lastName = 'Bauer', uuid = '44969325-c31f-4b8e-96d6-a59ff9b845b6'] 2017-06-26 11:12: 16.158 INFO 78681 --- [main ] hello.Application: Customer [id = 3, firstName = 'Kim', lastName = 'Bauer', uuid = '0cef24ad-ce97-4c79-b8a4-69ff575326fb']
с сообщением мы можем подтвердить, что поле uuid отлично работает !!!
Вам нужно будет добавить только следующее поле в свой объект:
import java.util.UUID;
@Column(unique = true, name = "uuid", nullable = false)
private String uuid = UUID.randomUUID().toString().toUpperCase();
@Id
автоматически синхронизируется с БД, другие сгенерированные поля - нет. Вам придется перезагрузить сущность из БД.