我正在嘗試為我的主物體創建一個包含物體和的OneToMany映射,但我收到以下錯誤:LinkedHashMapBVCP
集合映射中的重復列:com.test.model.B.pricing 列:b_name
我可能是錯的,但我相信它與@JoinColumnsor@MapKeyJoinColumn注釋有關,因為我以前沒有做過這樣的事情,所以我很確定我做錯了這部分。
我的目標是我應該能夠提供三個欄位:
b_name pc而c_id如VC/VCId
為了得到a和d_a例如P。
此外,如果有結構的東西更好的方法,那么我所有的耳朵,因為我個人真的不喜歡我怎么也TBH成立了我的表(將是很好,如果我能有b和b_p表,其中b_p可以只擁有地圖中的所有五個欄位(鍵和值)p)。
這是我的主要物體
@Setter
@Getter
@Entity
@Table(name = "b")
public class B implements Serializable {
@Id
@Column(nullable = false)
private String name;
@OneToMany(cascade = CascadeType.PERSIST)
@JoinTable(
name = "b_p",
joinColumns = @JoinColumn(name = "b_name", referencedColumnName = "name"))
@MapKeyJoinColumns({
@MapKeyJoinColumn(name = "b_name"),
@MapKeyJoinColumn(name = "p_c"),
@MapKeyJoinColumn(name = "c_id")
})
private Map<VC, Price> pricing = new LinkedHashMap<>();
...
}
地圖的鑰匙
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "v_c")
public class VC implements Serializable {
@EmbeddedId private VCId vcId;
}
密鑰的PK/復合密鑰
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class VCId implements Serializable {
@Column(name = "b_name")
private String bName;
@Column(name = "p_c")
private SomeEnum pc;
@Column(name = "c_id")
private String cId;
}
地圖的價值
@Setter
@Getter
@NoArgsConstructor
@Embeddable
@Entity
@Table(name = "price")
public class Price implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@Column(name = "amount")
private BigDecimal amount;
@Column(name = "discount_amount")
private BigDecimal discountAmount;
}
資料庫表
CREATE TABLE b
(
name VARCHAR(100) NOT NULL PRIMARY KEY
...
);
CREATE TABLE v_c
(
bundle_name VARCHAR(100) NOT NULL,
physical_currency TEXT NOT NULL,
coin_id VARCHAR(50) NOT NULL,
FOREIGN KEY (b_name) REFERENCES b (name) ON DELETE CASCADE,
PRIMARY KEY (b_name, p_c, c_id)
);
CREATE TABLE p
(
id BIGSERIAL NOT NULL PRIMARY KEY,
amount NUMERIC,
discount_amount NUMERIC DEFAULT 0.00
);
CREATE TABLE b_p
(
bname VARCHAR(100) NOT NULL,
p_c TEXT NOT NULL,
c_id VARCHAR(50) NOT NULL,
price_id BIGSERIAL NOT NULL,
FOREIGN KEY (b_name, p_c, c_id) REFERENCES v_c (b_name, p_c, c_id) ON DELETE CASCADE,
FOREIGN KEY (price_id) REFERENCES price (id) ON DELETE CASCADE,
PRIMARY KEY (b_name, p_c, c_id)
);
uj5u.com熱心網友回復:
@MapKeyJoinColumn(name = "bundle_name")從 MapKeyJoinColumns 中洗掉,因為當我們在 JoinTable 中創建 JoinColumn 時,它將創建我們不需要再次提及的列。
@JoinTable(
name = "bundle_pricing",
joinColumns = @JoinColumn(name = "bundle_name", referencedColumnName = "name"))
@MapKeyJoinColumns({
@MapKeyJoinColumn(name = "physical_currency"),
@MapKeyJoinColumn(name = "coin_id")
})
uj5u.com熱心網友回復:
為了防止重復映射錯誤,您只需指定哪個連接應該更新列,如下所示:
@OneToMany(cascade = CascadeType.PERSIST)
@JoinTable(name = "bundle_pricing",
joinColumns = @JoinColumn(name = "bundle_name",
referencedColumnName = "name"))
@MapKeyJoinColumns({
@MapKeyJoinColumn(name = "bundle_name", insertable = false, updatable = false),
@MapKeyJoinColumn(name = "physical_currency"), @MapKeyJoinColumn(name = "coin_id")})
private Map<VirtualCurrency, Price> pricing = new LinkedHashMap<>();
注:在insertable = false, updatable = false為BUNDLE_NAME在MapKeyJoinColumn
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/339854.html
標籤:爪哇 春天 PostgreSQL jpa
上一篇:使用IdClass宣告的復合鍵的用于deleteById的JPA查詢
下一篇:SpringJPA測驗-回滾
