簡體   English   中英

冬眠。 使用復合鍵映射@IdClass帶注釋的實體時重復的列

[英]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將其放入實體類中。 似乎沒有任何作用。

這種情況似乎微不足道,因此我們的設置可能有問題,但是我什至無法想象在哪里尋找問題。

任何建議深表感謝。

看來我是以此為己任。

問題是我在ExternalMatchExternalObject之間建立了雙向投標,我忘記了嘗試用其整數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM