Использование Hibernate UUIDGenerator с помощью аннотаций - PullRequest
67 голосов
/ 15 июня 2011

Я использую свой uuid следующим образом:

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

но я получаю умное предупреждение Hibernate:

Использование org.hibernate.id.UUIDHexGenerator который не генерирует IETF RFC 4122 совместимые значения UUID; рассмотреть возможность использования вместо org.hibernate.id.UUIDGenerator

Итак, я хочу переключиться на org.hibernate.id.UUIDGenerator, теперь мой вопрос: как мне сообщить об этом генератору Hibernate? Я видел, как какой-то парень использовал его как «hibernate-uuid» - вот что я попробовал, но с отрицательным результатом:

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

Ответы [ 8 ]

95 голосов
/ 15 июня 2011

Должно быть uuid2:

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

См. 5.1.2.2.1. Различные дополнительные генераторы .

16 голосов
/ 15 июня 2011

HibernateDoc говорит, что вы можете использовать следующее:

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

Я надеюсь, что вы используете Hibernate 3.5.

11 голосов
/ 30 апреля 2015

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

@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".

5 голосов
/ 11 сентября 2018

Как отметил @natan в комментарии, если вы используете Hibernate 5, то приведенного ниже кода достаточно:

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

Определите столбец id с типом BINARY(16) в MySQL или его эквивалентом в других реализациях SQL.

3 голосов
/ 04 февраля 2019

При этом будет использоваться 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 - проще писать запросы и просматривать содержимое таблицы.

Проверено на Hibernate 5.3

3 голосов
/ 01 сентября 2016

Неизвестный идентификатор. Генератор: 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;
}
2 голосов
/ 31 марта 2019

С текущей версией 5.4.2 Hibernate,

, если вы хотите, чтобы удобочитаемое * varchar (36) поле в таблице базы данных,
но также Сериализуемый 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;
0 голосов
/ 19 апреля 2018
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "UUID_ID")
public String getId(){
return id;
}

Это правильный способ использовать аннотацию для генераторов uuid в Hibernate 5.0.11.FINAL.

Примечание: ИТ устарело.

...