如何解决为什么 PSQL 会抱怨未知关系:org.postgresql.util.PSQLException:错误:关系“benannte_person”不存在?
当我尝试使用 Testcontainers 运行 SpringBootTest 时,我得到一个
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
...
org.postgresql.util.PSQLException: ERROR: relation "benannte_person" does not exist
当我在 DAO 上运行 findAll()
并且我不知道原因时,因为在我的整个代码中找不到“benanntee_person”(甚至在注释中也找不到)。
SQL DDL:
CREATE TYPE Erklaerungstyp AS ENUM ('aaaa','bbbb','cccc','dddd');
CREATE TYPE Geschlecht AS ENUM ('D','F','M');
DROP TABLE IF EXISTS Anschrift;
CREATE TABLE Anschrift (
a_id SERIAL PRIMARY KEY,Zusatz VARCHAR(255),Strasse VARCHAR(30) NOT NULL,Hausnummer VARCHAR(30) NOT NULL,plz VARCHAR(5) NOT NULL,Ort VARCHAR(80) NOT NULL,Bundesland VARCHAR(20),Land VARCHAR(20) NOT NULL,create_Date DATE NOT NULL,modify_Date DATE
);
INSERT INTO Anschrift VALUES (1,null,'Musterstrasse','13M','12345','Berlin','Deutschland','2001-09-28');
INSERT INTO Anschrift VALUES (2,'bei Müller','Musterweg','1-3','54321','Musterhausen','Muster-Hausen','2002-03-11');
DROP TABLE IF EXISTS ErklaerendePerson;
CREATE TABLE ErklaerendePerson (
ep_id SERIAL PRIMARY KEY,Geschlecht Geschlecht,Vorname VARCHAR(30) NOT NULL,Familienname VARCHAR(30) NOT NULL,Geburtsname VARCHAR(30) NOT NULL,Titel VARCHAR(10),Geburtsdatum Date NOT NULL,Geburtsort VARCHAR(30),Anschrift INTEGER REFERENCES Anschrift(a_id),Email VARCHAR(80),Telefon VARCHAR(20),create_Date DATE NOT NULL,modify_Date DATE
);
INSERT INTO ErklaerendePerson VALUES (1,'M','Max','Mustermann','Dipl.-Inf.','01.01.1901',1,'Max.Mustermann@max.de','0111 12 34 56 789','2001-09-28');
DROP TABLE IF EXISTS BenanntePerson;
CREATE TABLE BenanntePerson (
bp_id SERIAL PRIMARY KEY,Geschlecht Geschlecht,Vorname VARCHAR(30) NOT NULL,Familienname VARCHAR(30) NOT NULL,Geburtsdatum Date NOT NULL,Geburtsort VARCHAR(30),Anschrift INTEGER REFERENCES Anschrift(a_id),Telefon VARCHAR(20),Email VARCHAR(80),modify_Date DATE
);
INSERT INTO BenanntePerson VALUES (1,'Maxine','Musterpaar','12.07.1971','0111 444 55 66','Maxine.Musterpaar@xxx.de','2001-09-28');
DROP TABLE IF EXISTS Erklaerung;
CREATE TABLE Erklaerung (
ose_id SERIAL PRIMARY KEY,ep_id INTEGER REFERENCES ErklaerendePerson(ep_id),bp_id INTEGER REFERENCES BenanntePerson(bp_id),Anmerkung VARCHAR(120),Erklaerungstyp Erklaerungstyp NOT NULL,create_Date DATE NOT NULL,modify_Date DATE
);
INSERT INTO Erklaerung VALUES (1,'blablabla','VOLLUMFASSEND','2020.02.20');
COMMIT;
实体BenanntePerson
:
@Entity
@Table(name="BenanntePerson")
@Data
public class BenanntePerson implements Serializable {
@Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "bp_id")
private Integer bpId;
@Column(name = "Vorname",nullable = true)
private String vorname;
@Column(name = "Familienname",nullable = true)
private String familienname;
@Temporal(TemporalType.DATE)
@Column(name = "Geburtsdatum",nullable = false)
private Date geburtsdatum;
@Column(name = "Geburtsort",nullable = false)
private String geburtsort;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "a_id",nullable = false)
private Anschrift anschrift;
@Column(name = "Email",nullable = false)
private String email;
@Column(name = "Telefonnummer",nullable = false)
private String telefonnummer;
@OneToMany(mappedBy = "benanntePerson")
private Set<Erklaerung> erklaerungen;
@Column(name = "create_Date",insertable = true,updatable = false,nullable = false)
private Timestamp createDate;
@Column(name = "modify_Date",nullable = false)
private Timestamp modifyDate;
}
关系的 Erklaerung
实体:
@Entity
@Table(name="Erklaerung")
@Data
public class Erklaerung implements Serializable {
@Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ose_id")
private Integer oseId;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ep_id",nullable = false)
private ErklaerendePerson erklaerendePerson;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "bp_id",nullable = false)
private BenanntePerson benanntePerson;
@Enumerated(value = EnumType.STRING)
@Column(name = "Erklaerungstyp",nullable = false)
private Erklaerungstyp erklaerungstyp;
@Column(name = "Anmerkung",nullable = true)
private String anmerkung;
@Column(name = "create_Date",nullable = false)
private Timestamp modifyDate;
}
对应的JPA DAO:
@Repository
public interface BenanntePersonJpaDao extends JpaRepository<BenanntePerson,Integer> {
@NotNull
List<BenanntePerson> findByFamilienname(@NotNull String familienname);
@NotNull
List<BenanntePerson> findByVorname(@NotNull String vorname);
}
为什么 PSQL 会抱怨??
解决方法
这只是因为 @JoinColumn(name = "a_id",nullable = false)
与数据库表不匹配,因为没有 'a_id' 列。它在表定义中称为“Anschrift”。因此,在表定义中将“Anschrift
”重命名为“a_id
”可以解决问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。