![](/img/trans.png)
[英]Hibernate with annotations: “Repeated column in mapping fo entity” - Composite PK
[英]Hibernate. Repeated column when mapping @IdClass annotated entity with composite key
我曾經遇到過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上,使用鍵calss作為@Embeddable
並使用@EmbeddedId
將其放入實體類中。 似乎沒有任何作用。
這種情況似乎微不足道,因此我們的設置可能有問題,但是我什至無法想象在哪里尋找問題。
任何建議深表感謝。
看來我是以此為己任。
問題是我在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;
// ...
}
解決了重復的映射問題,但仍給我們帶來了雙電映射所造成的所有常見麻煩:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.