【问题标题】:How to use a UUID field without being a primary key with JPA?如何使用 UUID 字段而不是 JPA 的主键?
【发布时间】:2018-08-15 13:20:46
【问题描述】:

我有一个实体需要有一个 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)

【问题讨论】:

    标签: java hibernate jpa uuid


    【解决方案1】:

    经过多次搜索,以下是一些建议:

    Ex1

    @Id
    @Column(columnDefinition = "BINARY(16)")
    private UUID id = UUID.randomUUID();
    

    Ex2

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    @Column(columnDefinition = "CHAR(32)")
    private String id;
    

    链接:enter link description here

    【讨论】:

      【解决方案2】:

      您需要将 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());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-09-19
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2021-09-11
        • 2017-12-04
        相关资源
        最近更新 更多