【发布时间】:2021-07-27 21:53:12
【问题描述】:
假设我的 PostgreSQL 数据库中有两个表:
create table if not exists USM_USERS (
USR_ID INTEGER PRIMARY KEY,
USR_LOGIN VARCHAR(255) CONSTRAINT NN_USR_LOGIN NOT NULL
);
create table if not exists USM_PERSONS (
PRS_ID INTEGER PRIMARY KEY,
PRS_FIRST_NAME VARCHAR(255) CONSTRAINT NN_PRS_FIRST_NAME NOT NULL,
PRS_LAST_NAME VARCHAR(255) CONSTRAINT NN_PRS_LAST_NAME NOT NULL,
PRS_DOMAIN VARCHAR(1)
);
ALTER TABLE USM_USERS ADD CONSTRAINT FK_PRS_USR_ID
FOREIGN KEY (USR_ID) REFERENCES USM_PERSONS (PRS_ID);
我想将它们映射到面向对象的模型(使用 Java 和 Hibernate),如下所示:
@MappedSuperclass
@Table(name = "USM_PERSONS", schema = "public")
@DiscriminatorColumn(name = "PRS_DOMAIN")
@Getter
@Setter
public abstract class AbstractPersonData {
@Id
@Column(name = "PRS_ID")
private Long id;
@Column(name = "PRS_FIRST_NAME")
private String firstName;
@Column(name = "PRS_LAST_NAME")
private String lastName;
}
@Entity
@DiscriminatorValue("P")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "USM_PERSONS", schema = "public")
public class PersonData extends AbstractPersonData {
}
@Entity
@Table(name = "USM_USERS", schema = "public")
@DiscriminatorValue("U")
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name = "USR_ID")
@Getter
@Setter
public class UserData extends AbstractPersonData {
@Column(name = "USR_ID")
private Long usrId;
@Column(name = "USR_LOGIN")
private String login;
}
接下来我尝试使用 EntityManager (entityManager.find(PersonData.class, id); entityManager.find(UserData.class, id);) 对于 PersonData 它运行良好,但对于 UserData 我出现错误:
Caused by: org.postgresql.util.PSQLException: ERROR: column userdata0_.prs_id does not exist
Hint: Perhaps you meant to reference the column "userdata0_.usr_id".
Position: 8
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2552)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2284)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:322)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:481)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:401)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164)
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)
问题是:我是否遗漏了任何注释?或者我是否需要重新组织类/表?
【问题讨论】:
-
你能分享有问题的查询吗?
标签: java postgresql hibernate inheritance