Столбец JPA не существует

#java #postgresql #jpa #spring-data-jpa

Вопрос:

У меня есть сущность B , которая содержит карту сущностей lt;VC, Pgt; , в которой некоторые поля P , например A , не связаны с моей таблицей соединений, и выдает ошибку:

PSQLException: ОШИБКА: столбец 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 Maplt;VC, Pgt; pricing = new LinkedHashMaplt;gt;();   ... }  

Ключ 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; }  

the pricing map’s value

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

and its (P) key

 @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 }  

My tables

 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 );  

Что я делаю не так?

Ответ №1:

В конце концов я внес следующие изменения, и это сработало:

Заменил составные идентификаторы для p и v_c на идентификаторы автоматического приращения И добавил еще одно новое поле автоматического приращения, называемое pricing_p_id в моей b_p таблице:

 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 Maplt;VC, Pgt; pricing = new LinkedHashMaplt;gt;();