19

I'm trying to use generated UUIDs without @Id annotation, because my primary key is something else. The application does not generate an UUID, do you have an idea?

This is my declaration:

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

I'm using Hibernate 4.3.0 with Oracle10g.

2
  • Have you found the solution yet? I'm having the same problem. Commented Jul 1, 2014 at 13:02
  • I use the last answer as a fix Commented Jul 2, 2014 at 15:30

3 Answers 3

11

Check the Javadoc of GeneratedValue:

Provides for the specification of generation strategies for the values of primary keys.

With other words - it is not possible with just an annotation to initialize a 'none ID' attribute.

But you can use @PrePersist:

@PrePersist
public void initializeUUID() {
    if (uuid == null) {
        uuid = UUID.randomUUID().toString();
    }
}
Sign up to request clarification or add additional context in comments.

Comments

6

try this it may help

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

read this link read hibernate documents it is possible

6 Comments

I used your solution without the @Id annotation. No improvement :/
@Engineer - you should add more explanations to your answer. Links can become obsolete. It's definitely appropriate to cite sources, but you should provide a proper, full response.
Unable to build Hibernate SessionFactory: Caused by: org.hibernate.AnnotationException: Unknown Id.generator: hibernate-uuid
isn't it possible to have it generated without @Id annotation. I dont want my column to be a primary key.
This does not answer the question.
|
3

It's not because your UUID is a primary key that it's mandatory to have it annoted with @GeneratedValue.

For example, you can do something like this :

public class MyClass
{
   @Id
   private String uuid;

   public MyClass() {}

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

And in your app, generate a UUID before saving your entity :

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

2 Comments

I know the chance to have an UUID twice is very unlikely, but it could happen. That's why I wanted hibernate to manage UUIDs. Thank you for your help
Hibernate does nothing to prevent an ID - conflict (especially it does not generate a new value if the first value exists in the database already)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.