簡體   English   中英

Spring 引導 Hibernate 將數據插入到 Postgres 中的錯誤列中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM