当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Hibernate将数据插入Postgres中的错误列

勾渝
2023-03-14

初始情况:我有这两个实体,杂货清单和产品。

杂货清单:一个杂货清单可以有几种产品。

@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;

}

产品:一个产品可以分配给多个杂货店

@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\u id当前正在获取product\u id,映射表中的product\u id正在获取list\u id。我已尝试更改列名的顺序

共有1个答案

咸臻
2023-03-14

在咨询了弗拉迪米尔的解决方案后,它给了我一个想法,我解决了我的问题。问题出在@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;
 类似资料:
  • 请在Access数据库中插入数据时遇到错误代码。它一直说我的INSERT INTO语句中存在sytanx错误。有人能帮我解决这个问题吗?这是代码

  • 我有一个postgres数据库,包含一个名为“users”的表。该表有四个字段: id BIGSERIAL主键 显示名称文本不为空, 电子邮件文本不为空 电话号码文本 我想从dart代码中添加数据。我的尝试是这样的: 问题是我遇到了一个例外 (PostgreSQLSeverity.error 42601:在“display_name”处或附近出现语法错误)

  • 问题内容: 我有Cassandra数据库,可以通过Apache Spark使用SparkSQL从该数据库分析数据。现在我想将那些分析过的数据插入PostgreSQL中。除了使用PostgreSQL驱动程序之外,是否有其他方法可以直接实现此目的(我想通过postREST和Driver实现它,我想知道是否有类似的方法)? 问题答案: 目前,尚无将RDD写入任何DBMS的本地实现。这里是Spark用户列

  • 错误 用消息'SQLSTATE[HY000]照亮/数据库/查询异常:一般错误:1表配置文件没有名为标题的列(SQL:插入到配置文件(标题,描述,user_id,updated_at,created_at)值(asd,123123, 2, 2020-07-31 10:19:03, 2020-07-31 10:19:03))' 这是我在“$profile”时遇到的错误- 这是2020年07月31日07

  • 我在尝试将记录插入数据库时遇到错误。 错误如下: 守则: 数据库: