我遇到了Hibernate作为JPA提供程序进行复合主键处理的问题。 我的实体如下所示
// Entity class
@Entity
@IdClass(ExternalMatchPK.class)
@Table(name = "external_match")
public class ExternalMatch {
@Id
@Column(name = "place_id")
private Integer placeId;
@Id
@Column(name = "external_object_id")
private Integer externalObjectId;
// ... Other stuff here
}
// Key class
public class ExternalMatchPK implements Serializable {
private Integer placeId;
private Integer externalObjectId;
}
看起来非常简单,但无论我做什么,我都会遇到以下异常(为了便于阅读,将分割线条):
org.hibernate.MappingException:
Repeated column in mapping for entity: ExternalMatch
column: external_object_id (should be mapped with insert="false" update="false")
我尝试将实体类字段和键类字段的注释放在一起以及单独使用,将所有注释从字段移动到每个类的getter,使用key calss作为@Embeddable
并放置它使用@EmbeddedId
进入实体类。似乎没什么用。
这个案子似乎微不足道,所以我们的设置可能有问题,但我甚至无法想象在哪里寻找这个问题。
非常感谢任何建议。
答案 0 :(得分:0)
看来我用脚射击了自己。
问题是我在ExternalMatch
和ExternalObject
之间有一个双向映射我忘了尝试用整数id替换实际实体。
如此改变
// Entity class
@Entity
@IdClass(ExternalMatchPK.class)
@Table(name = "external_match")
public class ExternalMatch {
@Id
@Column(name = "place_id")
private Integer placeId;
@Id
@Column(name = "external_object_id")
private Integer externalObjectId;
// ... Other stuff here
}
// Key class
public class ExternalMatchPK implements Serializable {
private Integer placeId;
private Integer externalObjectId;
}
// Related entity class
@Entity
@Table(name = "external_object")
public class ExternalObject extends AbstractNameableEntity {
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "external_object_id", nullable = false)
private List<ExternalMatch> matches;
// ...
}
回复像这样的实际映射
// Entity class
@Entity
@IdClass(ExternalMatchPK.class)
@Table(name = "external_match")
public class ExternalMatch {
@Id
@ManyToOne
@JoinColumn(name = "external_object_id", referencedColumnName = "id")
private ExternalObject externalObject;
@Id
@ManyToOne
@JoinColumn(name = "place_id")
private Poi place;
// ... Other stuff here
}
// Key class
public class ExternalMatchPK implements Serializable {
private Poi place;
private ExternalObject externalObject;
}
// Related entity class
@Entity
@Table(name = "external_object")
public class ExternalObject extends AbstractNameableEntity {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "externalObject")
private List<ExternalMatch> matches;
// ...
}
解决了重复的映射问题,但却给我们留下了双向映射创建的所有常见问题:)