Вызов следующего значения последовательности в jpa - PullRequest
5 голосов
/ 18 июня 2010

У меня есть класс, сопоставленный как сущность, чтобы сохранить его в базе данных.У меня есть поле 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 ]

3 голосов
/ 18 июня 2010

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

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

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

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

0 голосов
/ 10 августа 2017

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

...