如何使用 UUID 字段而不是 JPA 的主键?
Posted
技术标签:
【中文标题】如何使用 UUID 字段而不是 JPA 的主键?【英文标题】:How to use a UUID field without being a primary key with 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)
【问题讨论】:
【参考方案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());
【讨论】:
以上是关于如何使用 UUID 字段而不是 JPA 的主键?的主要内容,如果未能解决你的问题,请参考以下文章
JPA中,在调用persist()时,数据库自动增长的主键如何处理