JPA列不存在



我有一个实体B,其中包含实体<VC, P>的映射,其中P中的一些字段,例如A没有与我的连接表链接,并给出错误:

PSQLException: ERROR: column pricing1_。Pricing_a不存在

我试图使它这样,当我坚持我的主要实体,B,我的地图中的所有实体也将被持久化,以及(如果可能的话)所有在一个去。

当我执行

时,这个错误都会发生
bRepo.save(b);

pRepo.saveAll(b.getPricing().values()); // by here the values at least exists in its own table (p)
bRepo.save(b);

这是我的

主体B

@Setter
@Getter
@Entity
@Table(name = "b")
public class B implements Serializable {
@Id
@Column(nullable = false)
private String name;
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "b_p",
joinColumns = @JoinColumn(name = "b_name", referencedColumnName = "name"))
@MapKeyJoinColumns({
@MapKeyJoinColumn(name = "p_c"),
@MapKeyJoinColumn(name = "c_id")
})
private Map<VC, P> pricing = new LinkedHashMap<>();
...
}

pricing映射键

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "v_c")
public class VC implements Serializable {
@EmbeddedId private VCId vcId;
}

及其(VC)组合键

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class VCId implements Serializable {
@Enumerated(EnumType.STRING)
@Column(name = "p_c")
private PC pC;
@Column(name = "c_id")
private String cId;
}

定价图的值

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
@Entity
@Table(name = "p")
public class P implements Serializable {
@EmbeddedId private PId pId;
}

及其(p)键

@Setter
@Getter
@NoArgsConstructor
@Embeddable
public class PId implements Serializable {
@Column(name = "a")
private BigDecimal a; // complains about this field
@Column(name = "d_a")
private BigDecimal dA; // and will probably complain about this one too
}

我的表
CREATE TABLE b
(
name   VARCHAR(100) NOT NULL PRIMARY KEY,
...
);
CREATE TABLE v_c
(
p_c   TEXT         NOT NULL,
c_id  VARCHAR(50)  NOT NULL,
PRIMARY KEY (p_c, c_id)
);
CREATE TABLE p
(
a       NUMERIC      NOT NULL,
d_a     NUMERIC      NOT NULL DEFAULT 0.0,
PRIMARY KEY (a, d_a)
);
CREATE TABLE b_p
(
b_name     VARCHAR(100) NOT NULL,
p_c        TEXT         NOT NULL,
c_id       VARCHAR(50)  NOT NULL,
a          NUMERIC      NOT NULL,
d_a        NUMERIC      NOT NULL DEFAULT 0.0,
PRIMARY KEY (b_name, p_c, c_id),

FOREIGN KEY (b_name) REFERENCES b (name) ON DELETE CASCADE,
FOREIGN KEY (p_c, c_id) REFERENCES v_c (p_c, c_id) ON DELETE CASCADE,
FOREIGN KEY (a, d_a) REFERENCES p (a, d_a) ON DELETE CASCADE
);

我做错了什么?

最后我做了以下更改,它工作了:

pv_c的复合id替换为自动递增id,并在我的b_p表中添加另一个新的自动递增字段pricing_p_id:

CREATE TABLE v_c
(
vc_id               BIGSERIAL    NOT NULL PRIMARY KEY,
p_c   TEXT          NOT NULL,
coin_id             VARCHAR(50)  NOT NULL
);
CREATE TABLE p
(
p_id                BIGSERIAL    NOT NULL PRIMARY KEY,
a                   NUMERIC      NOT NULL,
d_a                 NUMERIC      NOT NULL DEFAULT 0.0,
vc_id               BIGSERIAL,
FOREIGN KEY (vc_id) REFERENCES v_c(vc_id) ON DELETE CASCADE
);
CREATE TABLE b_p
(
b_name              VARCHAR(100)    NOT NULL,
vc_id               BIGSERIAL       NOT NULL,
pricing_p_id        BIGSERIAL       NOT NULL,
PRIMARY KEY (b_name, vc_id, pricing_p_id),
FOREIGN KEY (b_name) REFERENCES b (name) ON DELETE CASCADE,
FOREIGN KEY (vc_id) REFERENCES v_c (vc_id) ON DELETE CASCADE,
FOREIGN KEY (pricing_p_id) REFERENCES p (p_id) ON DELETE CASCADE
);

,然后将定价字段的映射更新为如下所示:

@OneToMany(cascade = CascadeType.ALL)
@MapKeyJoinColumn(name = "vc_id") // this
private Map<VC, P> pricing = new LinkedHashMap<>();

最新更新