首页 > 解决方案 > 如何使用 UUID 作为 Postgresql 中的外键与休眠

问题描述

我试图使用 JPA 来坚持使用一组电子邮件的人,但我无法到达那里。

我得到了这个例外 -

引起:org.postgresql.util.PSQLException:错误:关系“人”不存在

我有一个“人”和该人的一组“电子邮件”。我究竟做错了什么?

我的代码如下

创作桌

CREATE TABLE "Person" (
  publicId uuid DEFAULT uuid_generate_v4 (),
  name VARCHAR(64) NOT NULL
  PRIMARY KEY (publicId)
);

CREATE TABLE "Email" (
  emailId uuid DEFAULT uuid_generate_v4 (),
  email VARCHAR(64) NOT NULL,
  PRIMARY KEY (emailId),
  FOREIGN KEY (person) REFERENCES Person (publicId)
);

实体

@Id
@Column(name = "publicId")
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Type(type="org.hibernate.type.PostgresUUIDType")
private UUID publicId;

@NotBlank
@Column
private String name;

@OneToMany(mappedBy="person")
private Set<Email> emails;

电子邮件

@Id
@Column(name = "emailId")
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Type(type="org.hibernate.type.PostgresUUIDType")
private UUID emailId;

@NotBlank
@Column
private String email;

@ManyToOne
@JoinColumn(name="publicId", nullable=false)
private Person person;

和我的 DTO

DtoPersonCreate

@NotBlank
@VerifiedName
private String name;


@NotEmpty(message = "Input email list cannot be empty.")
private Set<DtoEmail> emails;

DtoEmail

@NotBlank
private String email;

标签: postgresql

解决方案


您的电子邮件表有几个问题。首先,它不包含用于标识 Person 表中相关行的列。其次,因为您的表是用双引号(“)创建的,所以对它的每个引用也必须用双引号引起来。由于您引用的表不是双引号,所以它不存在。即表 Person 与表“Person”不同。
解决方案:添加列publicId并双引号引用的表。(如果可以的话,最好去掉双引号。)

CREATE TABLE "Email" (
  emailId uuid DEFAULT uuid_generate_v4 (),
  email VARCHAR(64) NOT NULL,
  publicId uuid,
  PRIMARY KEY (emailId),
  FOREIGN KEY (publicId) REFERENCES "Person" (publicId)
);

推荐阅读