Hibernate, @SequenceGenerator и allocSize
Мы все знаем поведение Hibernate по умолчанию при использовании@SequenceGenerator
- увеличивает реальную последовательность базы данных наодин, умножьте это значение на 50 (по умолчаниюallocationSize
значение) - а затем использует это значение в качестве идентификатора объекта.
Это неправильное поведение и конфликтует сСпецификация который говорит:
allocSize - (Необязательно) Величина, на которую увеличивается значение при выделении порядковых номеров из последовательности.
Чтобы было ясно: я не беспокоюсь о пробелах между сгенерированными идентификаторами.
Я забочусь о идентификаторах, которыене соответствует с базовой последовательностью базы данных. Например: любое другое приложение (которое, например, использует простой JDBC) может захотеть вставить новые строки под идентификаторами, полученными из последовательности - но все эти значения могут уже использоваться Hibernate! Безумие.
Кто-нибудь знает какое-либо решение этой проблемы (без настройкиallocationSize=1
и, таким образом, снижение производительности)?
РЕДАКТИРОВАТЬ:
Чтобы все было понятно. Если у последней вставленной записи был ID =1
, то HB используйте значения51, 52, 53...
для его новых объектов, НО в то же время: sequence 'Значение s в базе данных будет установлено на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»