休眠。使用复合键映射@IdClass带注释的实体时重复的列

时间:2014-08-26 15:36:46

标签: java hibernate jpa primary-key composite-primary-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,使用key calss作为@Embeddable并放置它使用@EmbeddedId进入实体类。似乎没什么用。

这个案子似乎微不足道,所以我们的设置可能有问题,但我甚至无法想象在哪里寻找这个问题。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

看来我用脚射击了自己。

问题是我在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;

    // ...
}

解决了重复的映射问题,但却给我们留下了双向映射创建的所有常见问题:)