Как использовать UUID с Hibernate в качестве поля?

Я пытаюсь использовать сгенерированные UUID без @Id аннотации, потому что мой первичный ключ - это что-то еще. Приложение не генерирует UUID, есть ли у вас идея?

Это мое выражение:

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

Я использую Hibernate 4.3.0 с Oracle10g.

Ответ 1

попробуйте это, это может помочь

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

читать эту ссылку читать hibernate документы можно

Ответ 2

Проверьте Javadoc GeneratedValue:

Обеспечивает спецификацию стратегий генерации для значений первичных ключей.

Другими словами - невозможно только с аннотацией инициализировать атрибут "none ID".

Но вы можете использовать @PrePersist:

@PrePersist
public void initializeUUID() {
    if (uuid == null) {
        uuid = UUID.randomUUID().toString();
    }
}

Ответ 3

Это не потому, что ваш UUID является первичным ключом, который обязателен для его записи с помощью @GeneratedValue.

Например, вы можете сделать что-то вроде этого:

public class MyClass
{
   @Id
   private String uuid;

   public MyClass() {}

   public MyClass (String uuid) {
      this.uuid = uuid;
   }
}

И в своем приложении сгенерируйте UUID перед сохранением вашего объекта:

String uuid = UUID.randomUUID().toString();
em.persist(new MyClass(uuid)); // em : entity manager