【发布时间】:2016-02-12 11:30:40
【问题描述】:
(使用 Spring 3.1 和休眠 3.3)
我正在使用带有实体的 IdClass,该实体映射到具有 3 列作为复合键的表。
我的测试失败,抛出运行时异常MappingException 抱怨休眠无法确定我用作组合键一部分的列之一的类型。在这种情况下,它是 set 列(在 db 表中也称为“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 类
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;
}
}
【问题讨论】:
-
谁曾将我标记为-1,请理性地评论这个问题,以便我可以改进它,否则它只是一个无益的回应!
标签: java hibernate jpa composite-key