Данные Spring, сгенерированные JPA, поле uuid пуст

2

У меня есть организация под названием "Бронирование", у которой есть сгенерированное поле идентификатора, которое я использую в качестве первичного ключа. Он работает нормально. Я хочу добавить другое поле, 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, сгенерированный БД, либо сгенерировать его сам в коде. Какой из них предпочтительнее? Думаю, последний более результативен, но есть ли что-нибудь еще?

  • 1
    Только поле @Id автоматически синхронизируется с БД, другие сгенерированные поля - нет. Вам придется перезагрузить сущность из БД.
  • 0
    Только идентификатор генерируется. uuid не является идентификатором и, следовательно, не генерируется автоматически. Вы должны установить значение, так как поле не может быть пустым.
Теги:
spring
hibernate
jpa

2 ответа

2
Лучший ответ

вы можете выполнить заполнение с помощью @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 отлично работает !!!

  • 0
    Спасибо, я закончил тем, что использовал ваше решение, потому что я думаю, что использование PrePersist более элегантно.
1

Вам нужно будет добавить только следующее поле в свой объект:

import java.util.UUID;

@Column(unique = true, name = "uuid", nullable = false)
private String uuid = UUID.randomUUID().toString().toUpperCase();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню