Java 如何将UUID与Hibernate一起用作字段?

Java 如何将UUID与Hibernate一起用作字段?,java,hibernate,uuid,Java,Hibernate,Uuid,我试图使用生成的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与Oracle

我试图使用生成的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一起使用。

试试这个,它可能会有所帮助

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

阅读此read hibernate documents有可能

并不是因为您的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

检查
GeneratedValue
的Javadoc:

主键的值指定生成策略

换言之,仅使用注释不可能初始化“none ID”属性

但您可以使用
@PrePersist

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

我知道有两次UUID的机会是非常不可能的,但它可能发生。这就是我希望hibernate管理UUID的原因。感谢您的帮助Hibernate没有阻止ID冲突(特别是如果第一个值已经存在于数据库中,它不会生成新值),您找到解决方案了吗?我也有同样的问题。我用最后一个答案作为答案fix@FlorianMozart你应该接受最后一个answer@Engineer-你应该在你的答案中添加更多的解释。链接可能会过时。引用源代码是非常合适的,但是您应该提供一个正确的、完整的响应。
无法构建Hibernate SessionFactory:原因:org.Hibernate.AnnotationException:未知Id.generator:Hibernate uuid
在没有@Id注释的情况下生成它是不可能的。我不希望我的专栏成为主键。这不能回答问题。为什么要将其标记为答案?