Використання Hibernate UUIDGenerator за допомогою анотацій


77

Я використовую свій uuid наступним чином:

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "uuid", unique = true)
private String uuid;

але я отримую розумне попередження про сплячий режим:

Використання org.hibernate.id.UUIDHexGenerator, який не генерує значень UUID, сумісних з IETF RFC 4122; розгляньте можливість використання org.hibernate.id.UUIDGenerator

Тому я хочу перейти на org.hibernate.id.UUIDGenerator, тепер моє питання полягає в тому, як я повинен передати це генератору Hibernate. Я бачив, як якийсь хлопець використовував це як "сплячий режим" - отже, це те, що я пробував, але з негативним результатом:

@Id
@GeneratedValue(generator = "hibernate-uuid")
@GenericGenerator(name = "hibernate-uuid", strategy = "hibernate-uuid")
@Column(name = "uuid", unique = true)
private String uuid;

Відповіді:


108

Це повинно бути uuid2:

...
@GenericGenerator(name = "uuid", strategy = "uuid2")
...

Див. 5.1.2.2.1. Різні додаткові генератори .


4
Те саме для 4.1 . Також зверніть увагу, що він використовує java.util.UUID.randomUUID ().
Корей, ніж

24
Простий @Id @GeneratedValue private java.util.UUID id;працює в режимі Hibernate 5+. Див. Документацію .
Натан Кокс

в чому різниця між strategy = "uuid"і strategy = "uuid2"?
Олів'є Буассе

17

HibernateDoc каже, що ви можете використовувати наступне:

@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
@Column(name = "uuid", unique = true)
private String uuid;

Сподіваюсь, ви використовуєте Hibernate 3.5.


system-uuidце просто назва для Генератора, див. рядок 3. У рядку 2 на нього вказано посилання.
CSchulz

11

Спробуйте ...

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(name = "uuid", columnDefinition = "BINARY(16)")
public UUID getId()
{
    return id;
}

public void setId(UUID i)
{
    id = i;
}

Зверніть увагу на "uuid2" на відміну від "uuid".


8

Як зазначив @natan у коментарі, якщо ви використовуєте Hibernate 5, достатньо наведеного нижче коду:

@Id 
@GeneratedValue
private java.util.UUID id;

Визначте idстовпець із типом BINARY(16)в MySQL або він еквівалентний в інших реалізаціях SQL.


або ви також можете додати @Type(type="uuid-char")анотацію до VARCHAR(36)стовпця
Сергій Пономарьов

4

Невідомий ідентифікатор генератора: hibernate-uuid

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "id", unique = true)
public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

4

Для цього буде використаний UUID v4, а автоматично згенерований uuid буде збережений у стовпці, як зазвичай varchar(36):

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(length = 36)
private String uuid;

Це повинно мати певний вплив на продуктивність:

  • споживаний розмір більше ніж BINARY(16)
  • після гідратації java.lang.Stringекземпляр споживає більше пам'яті, ніж java.util.UUID: 112 байт для UUID як рядок проти 32 байт (тобто два longs + заголовок obj) для UUID.

Але набагато простіше працювати зі строковим UUID - простіше писати запити, і ви можете бачити вміст таблиці.

Перевірено в режимі глибокого сну 5.3


1

З поточною версією Hibernate 5.4.2,

якщо ви хочете легкий для читання (36) VARCHAR поле в таблиці бази даних,
але і Серіалізуемое UUID тип даних у вашому Java класу,
ви можете використовувати @Type(type = "uuid-char") в той же час ви оголосите свій член поля з java.util.UUIDтипом.

Зверніть увагу, що @Column(length = 36)важливо зменшити з 255 до 36 довжину поля в MySQL.

Зверніть увагу, що з PostgreSQL вам слід використовувати @Type(type = "pg-uuid")замість цього.

import org.hibernate.annotations.Type
import java.util.UUID
import javax.persistence.Column
import javax.persistence.GeneratedValue
import javax.persistence.Id

@Id @GeneratedValue
@Type(type = "uuid-char") @Column(length = 36)
private UUID id;

це нарешті спрацювало для мене, дякую! :) (з використанням UUID у Java, varchar (36) у SQL та
Spring

хоча я виявив, що це генерує uuid, навіть якщо дана сутність вже має таку з коду
Zoltán Umlauf

0
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "UUID_ID")
public String getId(){
return id;
}

Це правильний спосіб використання анотацій для uuid-генераторів у Hibernate 5.0.11.FINAL.

Примітка: ІТ застаріло.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.