java - DuplicateMappingException 表[]包含多个逻辑列名引用的物理列名[]:[_id]、[Id]
问题描述
我正在重写一个项目,但我遇到了构建问题。
Caused by: org.hibernate.DuplicateMappingException: Table [language] contains physical column name [person_id] referred to by multiple logical column names: [person_id], [personId]
在哪里
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@IdClass(LanguagePK.class)
@Table(name = "language")
public class Language {
@Id
@Column(name = "person_id")
private int personId;
@Id
@Column(name = "position")
private int position;
@Id
@Column(name = "language_name")
private String languageNameVal;
@Column(name = "language_level")
private String languageLevelVal;
@ManyToOne
@JoinColumn(name = "person_id", referencedColumnName = "id", nullable = false, insertable = false,updatable = false)
@JsonBackReference(value = "languages")
private Person person;
@ManyToOne
@JoinColumn(name = "language_name", referencedColumnName = "name", nullable = false, insertable = false,updatable = false)
@JsonIgnore
private LanguageName languageName;
@ManyToOne
@JoinColumn(name = "language_level", referencedColumnName = "level", nullable = false, insertable = false,updatable = false)
@JsonIgnore
private LanguageLevel languageLevel;
}
和
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "person")
public class Person implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@JsonManagedReference(value = "languages")
@OneToMany(mappedBy = "person", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<Language> languages;
我用
- 休眠 v. 5.4.13.Final
- spring-boot v. 2.2.5.RELEASE
- 毕业典礼
- 爪哇 1.8
- 龙目岛
与我使用 maven、SessionFactory 用于休眠、传统的 getter 和 setter 之前一样,这些更改非常小。
我在hibernate 4和5之间迁移期间看到了一些类似的问题,其中NamingStrategy是一个问题,但是此代码适用于hiberante为5.4.10.Final的第一个项目。
我喜欢 IdClass,因为我可以将 personId 作为原始值访问,并且不必从对象 person 加载数据。
我看到了类似的问题,insertable = false,updatable = false
但我有它......
在这里找到了类似的问题
解决方案
解决方案
问题在于访问策略字段与属性访问。
在之前的项目中,一切都是基于属性的访问,但是在我添加 lombok 之后,该类Language
是基于字段的访问。
上课LanguagePK
是
public class LanguagePK implements Serializable {
private static final long serialVersionUID = 1L;
private int personId;
private int position;
private String languageNameVal;
@Column(name = "person_id")
@Id
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
@Column(name = "position")
@Id
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
@Column(name = "language_name")
@Id
public String getLanguageNameVal() {
return languageNameVal;
}
public void setLanguageNameVal(String languageNameVal) {
this.languageNameVal = languageNameVal;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LanguagePK that = (LanguagePK) o;
if (personId != that.personId) return false;
if (position != that.position) return false;
if (languageNameVal != null ? !languageNameVal.equals(that.languageNameVal) : that.languageNameVal != null)
return false;
return true;
}
@Override
public int hashCode() {
int result = personId;
result = 31 * result + position;
result = 31 * result + (languageNameVal != null ? languageNameVal.hashCode() : 0);
return result;
}
}
已经够用了
@EqualsAndHashCode
public class EducationPK implements Serializable {
private int personId;
private int position;
}
推荐阅读
- javascript - 有局部变量时如何使其无点?
- deep-learning - 如何找到上述神经网络决策边界的方程?
- r - 无法基于另一列 R Shiny 在数据框中创建新列
- python - 有没有更好的方法在数据类的列表中提供大量参数?
- webpack - webpack 热中间件:在哪里设置 __resourceQuery?
- c# - 为什么在第一次输出后控制台冻结输出?
- javascript - Nuxt.js:@pivale/nuxt-image-loader-module 不以图像样式创建图像
- c# - 悬停 UWP 时更改按钮颜色
- google-cloud-platform - 我的 GCP 虚拟机服务器使用外部 IP 地址,但不是来自域
- python - 为什么 set(array) 比 array.sort() 快