映射:表包含多个逻辑列名引用的物理列名

问题描述

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

我不知道如何在 jiraInstanceIssue 类中实现 Sprint 字段。由于 Issue 可能未连接到任何 Sprint,我希望 jiraInstance 上的 Issue 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;

导致 hibernate 声称它必须是 insertable = true,updatable = false,但我需要能够在它未连接到任何冲刺时将 jiraInstance 添加到 Issue

解决方法

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

当您在一个类字段上以任何方式使用命名列引用时,请确保所有引用使用完全相同的名称。特别是当它们的名称不同时(在您的示例中为 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 不是解决此问题所必需的。

,

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

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

    private String jiraInstance;
}

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...