[英]Spring Boot Hibernate inserts Data into wrong Columns in Postgres
初始情況:我有這兩個實體,GroceriesList 和 Product。
GroceriesList:一個 GroceriesList 可以有多個產品。
@Entity
@Table(name = "lists")
public class GroceriesList {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "list_id")
private Long listId;
@Column(name = "list_name")
private String listName;
@ManyToMany(cascade = CascadeType.MERGE)
@JoinTable(name = "lists_products",
joinColumns = @JoinColumn(name = "product_id", referencedColumnName = "list_id"),
inverseJoinColumns = @JoinColumn(name = "list_id", referencedColumnName = "product_id")
)
private Set<Product> products;
}
Products:一個Product可以分配給多個GroceriesLists
@Entity
@Table(name = "products")
public class Product {
public enum Category {
Dairy,
Fruit,
Vegetable,
Meat,
Grains
}
// Product ID Column, GenerationType.Identity refers to auto incr in Postgres
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "product_id")
private Long productId;
@Column(name = "product_name")
private String productName;
@Column(name = "product_vendor")
private String productVendor;
@Enumerated(EnumType.STRING)
@Column(name = "product_category")
private Category productCategory;
@Column(name = "product_storedquantity")
private Integer productStoredQuantity;
@JsonIgnore
@ManyToMany(mappedBy = "products")
private List<GroceriesList> groceriesLists;
}
實體和關系存儲在 Postgres 中的三個不同表中(一個用於列表,一個用於產品,一個映射表用於關系)。
映射表: Mapping Table "lists_products"
示例產品: Id=4的示例產品
問題:我正在嘗試創建新列表,並且可行。 但是,正如您可以從映射表圖像中發現的那樣,Hibernate 將 ID 插入了錯誤的列。 映射表中的list_id當前獲取的是product_id,映射表中的product_id獲取的是list_id。 我試圖更改 GroceriesList 實體中 @JoinTable 注釋中列名和引用的順序。 但是,這會引發映射錯誤。 我認為我的錯誤在於該注釋中的某個地方。 有趣的是, Hibernate 使用了正確的SQL-Query 。 我在這里錯過了什么?
@JoinTable
中有一個錯字,@ @JoinColumn
名稱應該在它引用的實體之后選擇以避免混淆:
@ManyToMany(cascade = CascadeType.MERGE)
@JoinTable(name = "lists_products",
joinColumns = @JoinColumn(name = "list", // <- not "product"
referencedColumnName = "list_id"),
inverseJoinColumns = @JoinColumn(name = "product", // <- not "list"
referencedColumnName = "product_id")
)
private Set<Product> products;
在哪種情況下您使用 JPA @JoinTable 注釋?
https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinTable.html
在咨詢了 fladdimir 的解決方案后,它給了我一個想法,我解決了我的問題。 問題出在@JoinColumn 注釋中,我認為“name = ...”屬性是指數據庫中的列名。
@ManyToMany(cascade = CascadeType.MERGE)
@JoinTable(name = "lists_products",
joinColumns = @JoinColumn(name = "product_id", referencedColumnName = "list_id"),
inverseJoinColumns = @JoinColumn(name = "list_id", referencedColumnName = "product_id")
)
private Set<Product> products;
但是,該屬性是指 Spring Boot 中 Entity 內部聲明的變量,即 listId
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "list_id")
private Long listId;
因此,@JoinTable 注解的工作實現應如下所示,其中“name =...”使用該變量名:
@ManyToMany(cascade = CascadeType.MERGE)
@JoinTable(name = "lists_products",
joinColumns = @JoinColumn(name = "listId", referencedColumnName = "list_id"),
inverseJoinColumns = @JoinColumn(name = "productId", referencedColumnName = "product_id")
)
private Set<Product> products;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.