【问题标题】:Hibernate InheritanceType JOINED with PostgreSQLHibernate InheritanceType 加入 PostgreSQL
【发布时间】: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


【解决方案1】:

您可以删除@MappedSuperclass 并尝试在您的抽象类中添加@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

请参考:Mapping Java Entities for Persistence With Hibernate

【讨论】:

    猜你喜欢
    • 2013-06-17
    • 2015-11-14
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 2017-10-11
    • 2015-01-29
    相关资源
    最近更新 更多