Вызов следующего значения последовательности в jpa

У меня есть класс, сопоставленный как сущность, чтобы сохранить его в базе данных. У меня есть поле id в качестве первичного ключа, поэтому каждый раз, когда объект сохраняется, значение id извлекается из последовательности "myClass_pk_seq", кода, подобного следующему.

@Entity
@Table(name="myObjects")
public class MyClass {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
    @SequenceGenerator(name="sequence", sequenceName="myClass_pk_seq", allocationSize=1)
    @Column(name="myClassId")
    private Integer id;

    private Integer code;


    ...
}

Мне нужно сделать в атрибуте "code" что-то похожее на id. Мне нужно иметь последовательность, чтобы я мог назначить для кодирования следующее значение последовательности (чтобы зарезервировать это значение на тот случай, если пользователь захочет зарезервировать его, но без сохранения данных). Я имею в виду, что пользователь увидит поле, если он не знает, что вводить, он может нажать кнопку и получить на экране следующее возможное значение (и он может или не может принять его). Как я могу получить следующее значение последовательности, определенной в JPA (и увеличить ее значение), не сохраняя данные для поля не первичного ключа?

Я просто хочу иметь метод, который вызывает nextval для последовательности, связанной с полем "код", и возвращает значение. Какой лучший способ сделать это в JPA с аннотациями?

Благодарю.

2 ответа

Решение

Я просто хочу иметь метод, который вызывает nextval для последовательности, связанной с полем "код", и возвращает значение. Какой лучший способ сделать это в JPA с аннотациями?

  • Используйте собственный SQL, чтобы получить следующее значение последовательности, когда пользователь нажимает кнопку. Либо создайте последовательность вручную, либо используйте "поддельную сущность", чтобы JPA создала ее для вас.
  • Если вы не хотите использовать собственный SQL, вставьте сущность, основанную на последовательности, и получите ее идентификатор.

Оба решения звучат немного безобразно. Возможно, вы могли бы просто использовать генератор случайных чисел, такой как генератор UUID.

На самом деле, вы ничего не упомянули об уникальности code (и аннотации JPA не показывают, что это должно быть уникальным). Почему бы вам не вернуть случайный int?

Посмотрите другой вопрос / ответы на предмет использования последовательности, определенной не в полях идентификатора. Вы можете создать поддельную сущность с одним полем (типа Long id). Подключите его к последовательности, которую вы определили в БД. Затем создайте реализацию CrudRepository для этой сущности и вызовите ее метод save() с пустым экземпляром объекта поддельной сущности, который вы определили. Hibernate запустит для вас запрос "выберите YOUR_SEQ.NEXTVAL из двойного".

Другие вопросы по тегам