web-dev-qa-db-ja.com

アノテーションを介してHibernate UUIDGeneratorを使用する

私は次のようにUUIDを使用しています:

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

しかし、私はスマートな休止状態の警告を取得しています:

IETF RFC 4122準拠のUUID値を生成しないorg.hibernate.id.UUIDHexGeneratorを使用。代わりにorg.hibernate.id.UUIDGeneratorの使用を検討してください

それで、org.hibernate.id.UUIDGeneratorに切り替えたいのですが、今の質問は、それをHibernateのジェネレーターに伝える方法です。私は誰かが「休止状態-uuid」としてそれを使用したのを見ました-それでこれは私が試したことですが、否定的な結果があります:

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

そのはず uuid2

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

5.1.2.2.1。さまざまな追加ジェネレーター を参照してください。

96
axtavt

HibernateDoc は、以下を使用できると言います。

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

Hibernate 3.5を使用していることを願っています。

16
CSchulz

試してみてください...

@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;
}

「uuid」ではなく「uuid2」に注意してください。

11
kervin

@natanがコメントで指摘したように、Hibernate 5を使用している場合、以下のコードで十分です。

_@Id 
@GeneratedValue
private Java.util.UUID id;
_

MySQLでBINARY(16)のタイプでid列を定義するか、他のSQL実装では同等です。

6

不明なId.generator: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;
}
3
Ahmad R. Nazemi

これは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_よりも多くのメモリを消費します:UUIDでは文字列として112バイト対UUIDでは32バイト(つまり、2つのlongs + objヘッダー)。

ただし、文字列化されたUUIDを使用する方がはるかに簡単です。クエリを記述しやすくなり、テーブルの内容を確認できます。

Hibernate 5.3でテスト済み

3
stokito

現在の5.4.2 Hibernateバージョンでは、

データベーステーブルにHuman-Readablevarchar(36)フィールドが必要な場合、
また、Serializable[〜#〜] uuid [〜#〜]あなたの= Javaクラス、
_@Type(type = "uuid-char")を使用できます同時に _Java.util.UUID_型でフィールドメンバーを宣言します。

MySQLでフィールド長を255から36に減らすには、@Column(length = 36)が重要であることに注意してください。

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;
_
2
JavierFuentes
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "UUID_ID")
public String getId(){
return id;
}

これは、Hibernate 5.0.11.FINALでuuidジェネレーターの注釈を使用する適切な方法です。

注: ITは非推奨です。

0
Sumit