Вызов следующего значения последовательности в 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;


    ...
}

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

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

Спасибо.

2 4

2 ответа:

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

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

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

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

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