【问题标题】:Mapping: Table contains physical column name referred to by multiple logical column names映射:表包含多个逻辑列名引用的物理列名
【发布时间】:2021-05-19 06:34:28
【问题描述】:

我有 3 个类 - Issue、Sprint 和 EmbeddableId 类 SprintId。

我不知道如何在 IssueSprint 类中实现 jiraInstance 字段。由于Issue 可能未连接到任何Sprint,我想在Issue 上设置jiraInstance java 字段来跟踪在哪个jira 实例中创建了这个特定问题。当它连接到Sprint 时,我只想将jiraInstance 作为其复合键的一部分。但下面的映射给了我:

Caused by: org.hibernate.DuplicateMappingException: Table [issue] contains physical column name [jira_instance] referred to by multiple logical column names: [jira_instance], [jiraInstance]

类:

class Issue {
    @ManyToOne()
    @JoinColumns({
            @JoinColumn(
                    name = "sprint_id",
                    referencedColumnName = "sprint_id"),
            @JoinColumn(
                    name = "jira_instance",
                    referencedColumnName = "jira_instance")
    })
    private Sprint lastSprint;

    //this field causes clash with 'jira_instance' in @JoinColumn
    private String jiraInstance;
}

class Sprint {
    @EmbeddedId
    private SprintId id;
}
class SprintId implements Serializable {

    @Column(name = "sprint_id")
    private String sprintId;

    @Column(name = "jira_instance")
    private String jiraInstance;
}

将@Column 添加为:

@Column(name="jira_instance")
private String jiraInstance;

导致休眠声称它必须是insertable = true, updatable = false,但我需要能够将jiraInstance 添加到Issue,当它没有连接到任何冲刺时。

【问题讨论】:

    标签: hibernate many-to-one composite-key


    【解决方案1】:

    澄清一下——因为这个问题还没有明确的答案:

    当您在一个类字段上以任何方式使用命名列引用时,请确保 ALL 引用使用完全相同的名称。尤其是当它们的名称不同时(jira_instancejiraInstance,在您的示例中)。

    下面的例子应该可以工作:

    class Issue {
        @ManyToOne()
        @JoinColumns({
                @JoinColumn(
                        name = "sprint_id",
                        referencedColumnName = "sprint_id"),
                @JoinColumn(
                        name = "jira_instance",
                        referencedColumnName = "jira_instance") // make sure you use the same name
        })
        private Sprint lastSprint;
    
        @Column(name = "jira_instance") // make sure you use the same name
        private String jiraInstance;
    }
    
    class Sprint {
        @EmbeddedId
        private SprintId id;
    }
    class SprintId implements Serializable {
    
        @Column(name = "sprint_id")
        private String sprintId;
    
        @Column(name = "jira_instance") // make sure you use the same name
        private String jiraInstance;
    }
    

    这意味着:insertable = false, updatable = false 不是解决此问题所必需的。

    【讨论】:

      【解决方案2】:

      您必须了解,只能使用一个属性/字段来编写列,否则可能会发生冲突。使用以下映射:

      class Issue {
          @ManyToOne()
          @JoinColumns({
                  @JoinColumn(
                          name = "sprint_id",
                          referencedColumnName = "sprint_id"),
                  @JoinColumn(
                          name = "jira_instance",
                          referencedColumnName = "jira_instance", insertable = false, updatable = false)
          })
          private Sprint lastSprint;
      
          private String jiraInstance;
      }
      

      您只需要确保在设置lastSprint 时,还将jiraInstance 设置为Sprint#jiraInstance 的值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-26
        • 2020-01-01
        • 2022-08-22
        • 2020-08-10
        • 2020-02-21
        • 2017-06-03
        • 2021-12-08
        相关资源
        最近更新 更多