hibernate MappingException:无法使用复合键确定类型
hibernate MappingException: Could not determine type using composite key
(使用 Spring 3.1 和休眠 3.3)
我正在使用一个 IdClass 和一个映射到 table 的实体,该 table 有 3 列作为复合键。
我的测试失败并抛出运行时异常 MappingException
抱怨 hibernate 无法确定我用作复合键一部分的列之一的类型。在这种情况下,它是 set
列(在数据库 table 中又称为 "set_id")。
这是我的实体的简化版本
@Entity
@Table(name = "the_table")
@IdClass(CompositeKey.class)
public class MyEntity {
@Id
@Column(name = "page_id")
private Integer pageId;
@Id
@Column(name = "xml_id")
private Integer xmlId;
@Id
@ManyToOne
@JoinColumn(name = "set_id")
private CustomSet set;
public CustomSet getSet() {
return set;
}
public void setSet(CustomSet set) {
this.set = set;
}
public Integer getPageId() {
return pageId;
}
public void setPageId(Integer pageId) {
this.pageId = pageId;
}
public Integer getXmlId() {
return xmlId;
}
public void setXmlId(Integer xmlId) {
this.xmlId = xmlId;
}
}
这里是组合键id class
public class CompositeKey implements Serializable {
private Integer pageId;
private Integer xmlId;
private CustomSet set;
public CompositeKey(){}
public CompositeKey(Integer pageId, Integer xmlId, CustomSet set){
this.pageId = pageId;
this.xmlId = xmlId;
this.set = set;
}
public Integer getPageId() {
return pageId;
}
public Integer getXmlId() {
return xmlId;
}
public CustomSet getSet() {
return set;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof CompositeKey)) return false;
CompositeKey that = (CompositeKey) o;
if (!getPageId().equals(that.getPageId())) return false;
if (!getXmlId().equals(that.getXmlId())) return false;
return getSet().equals(that.getSet());
}
@Override
public int hashCode() {
int result = getPageId().hashCode();
result = 31 * result + getXmlId().hashCode();
result = 31 * result + getSet().hashCode();
return result;
}
}
我发现答案很简单,我需要用与实体中相同的映射类型注释复合键 class 中的 "set" 列。
此外,因为我有 table 列名称与代码中的变量名称不同,所以我还必须向复合键 class 中的变量添加额外的列注释.
这是我对 CompositeKey
...
所做的代码更改
@Column(name = "page_id")
private Integer pageId;
@Column(name = "xml_id")
private Integer xmlId;
@ManyToOne
@JoinColumn(name = "set_id")
private CustomSet set;
就是这样,现在 hibernate 知道该数据库使用什么类型的映射和列名 table。我原以为它会从实体中提取所有内容,但我想不会。
我有一个类似的问题,我通过将注释 @ManyToOne 和 @JoinColumn 添加到主 class 上的一个主键(不幸的是我丢失了)来解决了这个问题。在这里发帖以防有人犯同样的错误。
实际上,为复合键上的属性添加注释对我来说是错误的。我认为这不是正确的方法。
(使用 Spring 3.1 和休眠 3.3)
我正在使用一个 IdClass 和一个映射到 table 的实体,该 table 有 3 列作为复合键。
我的测试失败并抛出运行时异常 MappingException
抱怨 hibernate 无法确定我用作复合键一部分的列之一的类型。在这种情况下,它是 set
列(在数据库 table 中又称为 "set_id")。
这是我的实体的简化版本
@Entity
@Table(name = "the_table")
@IdClass(CompositeKey.class)
public class MyEntity {
@Id
@Column(name = "page_id")
private Integer pageId;
@Id
@Column(name = "xml_id")
private Integer xmlId;
@Id
@ManyToOne
@JoinColumn(name = "set_id")
private CustomSet set;
public CustomSet getSet() {
return set;
}
public void setSet(CustomSet set) {
this.set = set;
}
public Integer getPageId() {
return pageId;
}
public void setPageId(Integer pageId) {
this.pageId = pageId;
}
public Integer getXmlId() {
return xmlId;
}
public void setXmlId(Integer xmlId) {
this.xmlId = xmlId;
}
}
这里是组合键id class
public class CompositeKey implements Serializable {
private Integer pageId;
private Integer xmlId;
private CustomSet set;
public CompositeKey(){}
public CompositeKey(Integer pageId, Integer xmlId, CustomSet set){
this.pageId = pageId;
this.xmlId = xmlId;
this.set = set;
}
public Integer getPageId() {
return pageId;
}
public Integer getXmlId() {
return xmlId;
}
public CustomSet getSet() {
return set;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof CompositeKey)) return false;
CompositeKey that = (CompositeKey) o;
if (!getPageId().equals(that.getPageId())) return false;
if (!getXmlId().equals(that.getXmlId())) return false;
return getSet().equals(that.getSet());
}
@Override
public int hashCode() {
int result = getPageId().hashCode();
result = 31 * result + getXmlId().hashCode();
result = 31 * result + getSet().hashCode();
return result;
}
}
我发现答案很简单,我需要用与实体中相同的映射类型注释复合键 class 中的 "set" 列。
此外,因为我有 table 列名称与代码中的变量名称不同,所以我还必须向复合键 class 中的变量添加额外的列注释.
这是我对 CompositeKey
...
@Column(name = "page_id")
private Integer pageId;
@Column(name = "xml_id")
private Integer xmlId;
@ManyToOne
@JoinColumn(name = "set_id")
private CustomSet set;
就是这样,现在 hibernate 知道该数据库使用什么类型的映射和列名 table。我原以为它会从实体中提取所有内容,但我想不会。
我有一个类似的问题,我通过将注释 @ManyToOne 和 @JoinColumn 添加到主 class 上的一个主键(不幸的是我丢失了)来解决了这个问题。在这里发帖以防有人犯同样的错误。
实际上,为复合键上的属性添加注释对我来说是错误的。我认为这不是正确的方法。