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