问题描述
我有 3 个类 - Issue、Sprint 和 EmbeddableId 类 SprintId。
我不知道如何在 jiraInstance
和 Issue
类中实现 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_instance
与 jiraInstance
)。
以下示例应该可以工作:
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
的值