Можно ли создать счетчик с возможностью запроса, используя последовательность Postgres и отображение Hibernate?

Я получаю сообщение об ошибке "Нет типа данных для узла" при выполнении этого запроса:

session.createQuery("select nextval( 'next_num_seq' )")

что я знаю, означает, что мне нужно сделать его свойством класса, но я не смог найти способ добавить последовательность в класс, только как заставить последовательность генерировать идентификаторы для класса.

Есть ли способ включить в отображение Hibernate последовательность, которая не является генератором идентификаторов?

1 ответ

Таким образом, этот вопрос является действительным, но путь к решению движется в неправильном направлении. Отображение последовательности в объект управляемой области не является "хорошей" идеей, поскольку это две отдельные концепции.

Последовательности, такие как та, которую вы пытаетесь запросить из бэкэнда PostgreSQL, представляют собой центральную концепцию для генерации уникальных идентификаторов для значений первичных ключей для кортежей или - с точки зрения приложения ORM - объектов Java. Таким образом, неуместно сопоставлять их текущее состояние с сущностью домена. Вместо этого устанавливается одно конкретное значение, полученное из такой последовательности, например next_num_seq - в один конкретный объект, который будет сохранен в реляционной базе данных. Следовательно, связанный класс такого доменного объекта связан с этой последовательностью, например, с помощью выделенных аннотаций ORM (или с помощью аналогичных подходов).

В JavaDoc Session Интерфейс мы находим метод createNativeQuery(String sql) который унаследован от EntityManager интерфейс, см. также здесь.

Это описано следующим образом:

Query createNativeQuery(java.lang.String sqlString)

Создайте экземпляр Query для выполнения собственного оператора SQL, например, для обновления или удаления.

Параметры: sqlString - собственная строка запроса SQL

Возвращает: новый экземпляр запроса

Таким образом, вы можете изменить свой код для выполнения собственного запроса к базе данных PostgreSQL следующим образом:

Query q = session.createNativeQuery("select nextval( 'next_num_seq' )");

Это дает вам возможность прочитать следующее действительное значение последовательности как long или же Number экземпляр для ваших целей программирования.

Обратите внимание: будьте осторожны, чтобы не использовать это значение несколько раз (для нескольких объектов), так как это может вызвать проблемы согласованности в вашем бэкэнде при использовании, например, в контексте отдельных потоков.

Надеюсь это поможет.

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