Грабли генерации id в Hibernate
За использование фреймворков приходится платить. Пусть есть Entity с простым полем
@Id
val id: UUID = UUID.randomUUID()
Вроде все просто: при создании сущности ей сгенерируется id
, потом запишем его в базу одним запросом. Однако добрый EntityManager сделает тут один дополнительный запрос — а вдруг это не новая сущность? Поэтому приходится писать так:
@Id
@GeneratedValue
@Column(name = "id", updatable = false, nullable = false)
val id: UUID? = null
Тут мы информируем EntityManager, что это поле он должен сгенерировать сам (по умолчанию генерируется UUID), и что лезть в базу не надо, если id
отсутствует. А потом защищаемся от самих себя — запрещаем писать в базу сущность с отсутствующим id
, ведь компилятор это уже проверить не может. Зато он не знает ничего про генерацию этого поля и вполне справедливо считает, что раз оно может отсутствовать, то изволь переписать почти весь код его использующий, как минимум equals
и hashCode
.
(Скоро у меня кончатся идеи для постов и канал превратится в нытье про то, как я не люблю Spring и стандартный стек вокруг него).