【问题标题】:Unable to find column with logical name - hibernate exception when using @OneToMany and @JoinColumn无法找到具有逻辑名称的列 - 使用 @OneToMany 和 @JoinColumn 时出现休眠异常
【发布时间】:2022-10-13 15:15:00
【问题描述】:

我的应用程序订单和产品中有两个实体(一对多关联)。我的目标是在 Order 实体中建立单向 OneToMany 关系(我知道这不是最好的解决方案,但这是业务需求)。数据库模式由 Liquibase 生成并由 Hibernate 验证。为了清楚起见,实体已被简化。数据库是 Postgres。

尽管模式创建正确,但 Hibernate 会抛出异常:

Caused by: org.hibernate.cfg.RecoverableException: Unable to find column with logical name: productId in org.hibernate.mapping.Table(orders) and its related supertables and secondary tables
    at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:844) ~[hibernate-core-5.6.11.Final.jar:5.6.11.Final]
    at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:126) ~[hibernate-core-5.6.11.Final.jar:5.6.11.Final]
    at org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1740) ~[hibernate-core-5.6.11.Final.jar:5.6.11.Final]
    ... 37 common frames omitted
Caused by: org.hibernate.MappingException: Unable to find column with logical name: productId in org.hibernate.mapping.Table(orders) and its related supertables and secondary tables
    at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:839) ~[hibernate-core-5.6.11.Final.jar:5.6.11.Final]
    ... 39 common frames omitted

为了证明模式是正确生成的,我替换了@OneToMany注释@ManyToOne它工作正常!突然之间,Hibernate 能够找到该列。在那之后,我开始假设 Hibernate 中存在某种错误......

有谁知道,如何解决这个问题?

我的代码如下所示:

订单.java

@Entity
@Table(name = "orders")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long orderId;

    @Column
    private String clientName;

    @OneToMany
    @JoinColumn(name = "productIdFK", referencedColumnName = "productId")
    private List<Product> productList = new ArrayList<>();

}

产品.java

@Entity
@Table(name = "products")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long productId;

    @Column
    private String name;
}

Liquibase 脚本

{
  "databaseChangeLog": [
    {
      "changeSet": {
        "id": "Create PRODUCT table",
        "author": "me",
        "changes": [
          {
            "createTable": {
              "tableName": "products",
              "columns": [
                {
                  "column": {
                    "name": "productId",
                    "type": "bigint",
                    "constraints": {
                      "nullable": false,
                      "unique": true,
                      "primaryKey": true
                    }
                  }
                },
                {
                  "column": {
                    "name": "name",
                    "type": "varchar(250)",
                    "constraints": {
                      "nullable": true,
                      "unique": false
                    }
                  }
                }
              ]
            }
          },
          {
            "createTable": {
              "tableName": "orders",
              "columns": [
                {
                  "column": {
                    "name": "orderId",
                    "type": "bigint",
                    "constraints": {
                      "nullable": false,
                      "unique": true,
                      "primaryKey": true
                    }
                  }
                },
                {
                  "column": {
                    "name": "clientName",
                    "type": "varchar(250)",
                    "constraints": {
                      "nullable": true,
                      "unique": false
                    }
                  }
                },
                {
                  "column": {
                    "name": "productIdFK",
                    "type": "bigint",
                    "constraints": {
                      "nullable": true,
                      "unique": false
                    }
                  }
                }
              ]
            }
          }
        ]
      }
    }
  ]
}

来自 liquibase 脚本的片段生成关系

{
            "addForeignKeyConstraint": {
              "constraintName": "fk_product_order",
              "baseColumnNames": "productIdFK",
              "baseTableName": "orders",
              "referencedColumnNames": "productId",
              "referencedTableName": "products"
            }
          }

【问题讨论】:

    标签: java spring spring-boot hibernate spring-data-jpa


    【解决方案1】:
    @OneToMany
    @JoinColumn(name = "orderId", referencedColumnName = "productId")// try orderId
    private List<Product> productList = new ArrayList<>();
    

    【讨论】:

      【解决方案2】:

      一旦你尝试这个 希望这会成功

      改成这个订单.java

      @OneToMany(cascade = CascadeType.ALL, mappedBy= "order")
      private List<Product> productList = new ArrayList<>();
      

      添加这个产品.java

      @ManyToOne
      @JsonIgnore
      private Order order;
      

      让我知道

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        相关资源
        最近更新 更多