Мы все знаем поведение по умолчанию для Hibernate при использовании @SequenceGenerator
- он увеличивает реальную последовательность базы данных на один, несколько это значение на 50 (значение по умолчанию allocationSize
) - и затем использует это значение как идентификатор объекта.
Это неправильное поведение и конфликтует с спецификацией, в котором говорится:
allocSize - (Необязательно) Сумма для увеличения при выделении порядковых номеров из последовательности.
Чтобы быть ясным: я не беспокоюсь о пробелах между сгенерированными идентификаторами.
Мне не нравятся идентификаторы не согласованы с базовой базой данных. Например: любое другое приложение (например, использующее простой JDBC) может захотеть вставить новые строки под идентификаторами, полученными из последовательности, но все эти значения могут уже использоваться Hibernate! Безумие.
Кто-нибудь знает какое-либо решение этой проблемы (не устанавливая allocationSize=1
и тем самым снижая производительность)?
EDIT:
Чтобы все было ясно.
Если в последней вставленной записи был ID = 1
, то HB использует значения 51, 52, 53...
для своих новых объектов, но в то же время: значение последовательности в базе данных будет установлено на 2
. Это может привести к ошибкам, когда другие приложения используют эту последовательность.
В руке: спецификация говорит (в моем понимании), что последовательность базы данных должна быть установлена на 51
, и тем временем HB должен использовать значения из диапазона 2, 3 ... 50
ОБНОВЛЕНИЕ:
Как упоминал Стив Эберсол: поведение, описанное мной (а также наиболее интуитивное для многих), можно включить, установив hibernate.id.new_generator_mappings=true
.
Спасибо всем вам.
ОБНОВЛЕНИЕ 2:
Для будущих читателей ниже вы можете найти рабочий пример.
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
@SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
private Long id;
}
persistence.xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>