带有非主键的JPA一对一显示无法找到具有逻辑名称错误的列

时间:2019-07-13 07:45:45

标签: hibernate spring-boot jpa entity

我正在使用springboot + jpa + hibernate设计货币对表的实体。数据库是postgres。架构如下-

DDL货币

CREATE TABLE currency (
    id bigint NOT NULL PRIMARY KEY,
    entity_id VARCHAR(255) NOT NULL UNIQUE,
    code VARCHAR(255),
    name VARCHAR(255),
    description VARCHAR(255),
    denomination_code VARCHAR(255),
    denomination_name VARCHAR(255),
    denomination_description VARCHAR(255),
    denomination_units integer,
    status VARCHAR(255)
);

currency_pair的DDL

CREATE TABLE currency_pair (
    id bigint NOT NULL PRIMARY KEY,
    entity_id VARCHAR(255) NOT NULL UNIQUE,
    code VARCHAR(50) NOT NULL,
    name VARCHAR(250) NOT NULL,
    description VARCHAR(500) NOT NULL,
    base_currency_id VARCHAR(255) NOT NULL REFERENCES currency(entity_id),
    quote_currency_id VARCHAR(255) NOT NULL REFERENCES currency(entity_id),
    status VARCHAR(255),
);

我的实体类如下:-

货币实体-

@Entity
@Table(name = "currency")
public class Currency implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NaturalId
    @Column(nullable = false)
    private String entityId;

    @Column(nullable = false)
    private String code;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String description;

    @Column(nullable = false)
    private String denominationCode;

    @Column(nullable = false)
    private String denominationName;

    @Column(nullable = false)
    private String denominationDescription;

    @Column(nullable = false)
    private Integer denominationUnits;

    @Column(nullable = false)
    private String mask;

    @Column(nullable = false)
    private String status;

    /* getters and setters */
}

货币对实体-

@Entity
@Table(name = "currency_pair")
public class CurrencyPair implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NaturalId
    @Column(nullable = false)
    private String entityId;

    @Column(nullable = false)
    private String code;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String description;

    @OneToOne
    @JoinColumn(name = "base_currency_id", referencedColumnName = "entity_id")
    private Currency baseCurrency;

    @OneToOne
    @JoinColumn(name = "quote_currency_id", referencedColumnName = "entity_id")
    private Currency quoteCurrency;

    @Column(nullable = false)
    private String status;

    /* Getters and setters */
}
base_currency_id表中的

quote_currency_idcurrency_pairentity_id表中的非主键列currency

当我启动springboot应用程序时,出现以下错误-

  

原因:org.hibernate.MappingException:无法找到具有以下内容的列   逻辑名称:org.hibernate.mapping.Table(currency)中的 entity_id   其相关的超表和辅助表位于   org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:832)   〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final]在   org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:256)   〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final]在   org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:101)   〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final]在   org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1827)   〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final]在   org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1771)   〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final]在   org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1658)   〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final]在   org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:287)   〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final]在   org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904)   〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final]在   org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935)   〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final]在   org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57)   〜[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE]在   org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)   〜[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE]在   org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390)   〜[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE]在   org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377)   〜[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE]在   org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)   〜[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE]在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)   〜[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)   〜[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE] ... 95个通用框架   省略

注意:我无法更改ddl查询,因此该怎么做才能修复实体类

2 个答案:

答案 0 :(得分:1)

找不到列entity_id,因为它在Currency表中定义为entityId

您可以通过在name类的entityId列上添加Currency属性来解决此问题:

@Entity
@Table(name = "currency")
public class Currency implements Serializable {

    // ...

    @NaturalId
    @Column(name="entity_id", nullable = false)
    private String entityId;

    // ...

答案 1 :(得分:1)

由于您在referencedColumnName = "entity_id"中有CurrencyPair与货币有关。 在“货币”中,名称为与id_entity_id不匹配的entityId。您可以在Currency

中添加 name属性,如下所示

更改

@NaturalId
@Column(nullable = false)
private String entityId;

收件人

@NaturalId
@Column(name = "entity_id", nullable = false)
private String entityId;