java - 如何在不作为 JPA 主键的情况下使用 UUID 字段?

标签 java hibernate jpa uuid

我有一个实体需要一个 UUID 类型的唯一键(非主键)。

@Entity
public class MyEntity {

    @Id
    @NotNull
    @GeneratedValue(strategy = SEQUENCE, generator = "seq_entity")
    @SequenceGenerator(name = "seq_entity", sequenceName = "seq_entity", allocationSize = 1)
    private Long id;

    @NotNull
    @Type(type = "pg-uuid")
    @Column(name = "uu_id", unique = true)
    private UUID uuid;

    @NotNull
    @Size(max = 30)
    private String name;

    // gets and sets

}

当我坚持这个实体时,如何在我的 DAO 类中看到下面的内容:

@Transactional
public class EntityDAO {

    @Inject
    private EntityManager em;

    public void insert(MyEntity myEntity) { //myEntity comes only with name attribute 
        myEntity.setUUID(UUID.randomUUID()); //I'd like to generate automatically by the database
        em.persist(myEntity);
    }

}

正在数据库中插入,但控制台出现以下错误:

09:09:43,529 SEVERE [br.gov.frameworkdemoiselle.exception] (http-/127.0.0.1:8080-1) Erro interno do servidor: org.yaml.snakeyaml.error.YAMLException: No JavaBean properties found in java.util.UUID
    at org.yaml.snakeyaml.introspector.PropertyUtils.getProperties(PropertyUtils.java:97)
    at org.yaml.snakeyaml.introspector.PropertyUtils.getProperties(PropertyUtils.java:87)
    at org.yaml.snakeyaml.representer.Representer.getProperties(Representer.java:243)

最佳答案

您需要将 UID 映射到字符串。如果没有从 UID 到 String 的标准映射,则需要使用 UserType。

或者仅使用 String 而不是 UUID 作为属性。

您可以在 Hibernate documentation 的第 3.10 章中阅读映射 UUID 的备选方案

您可以使用 EntityListener 而不是在服务中设置 ID,您可以在 @PrePersist 方法中设置它。

    @Entity
public class MyEntity {

    @PrePersist
    private assignUIID(){
       myEntity.setUUID(UUID.randomUUID());
    }
}

关于java - 如何在不作为 JPA 主键的情况下使用 UUID 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49151929/

相关文章:

java - 没有名为 *** 的 EntityManager 的持久性提供程序

Hibernate hbm2ddl.auto,可能的值以及它们的作用

java - hibernate中如何删除连接表中的记录

java - Hibernate:从部分解析/翻译 HQL 以获取对类别名、类名

java - Glassfish 记录日期和夏令时?

java - Spring 4 + JPA (Hibernate 4) + JTA 事务管理器不会自动刷新

java - 如何覆盖继承类上的 hibernate JPA 过滤器?

java - 使用\n 分隔符分割

java - 为什么 'gradle run' 似乎只能在 Windows 命令行中工作?

java - 运行时找不到 JDBC 类