初始情況: 我有這兩個物體,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;
}
產品: 一個產品可以分配到多個 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 中的三個不同表中(一個用于串列,一個用于產品,一個用于關系的映射表)。
映射表: 映射表“lists_products”
樣品產品: Id=4 的樣品產品
問題:我正在嘗試創建新串列,這很有效。但是,正如您可以從映射表影像中發現的那樣,Hibernate 將 ID 插入到錯誤的列中。映射表中的list_id當前獲取的是product_id,映射表中的product_id獲取的是list_id。我試圖在 GroceriesList 物體的 @JoinTable 注釋中更改列名和參考的順序。但是,這會引發映射錯誤。我認為我的錯誤在于該注釋中的某個地方。有趣的是,Hibernate 使用了正確的SQL-Query。我在這里錯過了什么?
uj5u.com熱心網友回復:
中有一個錯字@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
uj5u.com熱心網友回復:
在咨詢了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 中物體內部的宣告變數,即 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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/380756.html
標籤:爪哇 PostgreSQL的 弹簧靴 休眠 弹簧数据-jpa
