Ошибка сопоставления JPA - недостаточно предоставленных метаданных в вашем классе идентификаторов - PullRequest
1 голос
/ 19 января 2011

Я пытаюсь сделать отображение в JPA.

@Entity
public class Auction {

    @Id
    private Integer auctionId;

    @OneToMany(mappedBy="auctionId")
    @MapKey(name="auctionParamId")
    private Map<AuctionParam, AuctionParamValue> values;

}

@Entity
public class AuctionParam {

    @Id
    private Integer auctionParamId;

    private String description;

}

@Entity
public class AuctionParamValue {

    @EmbeddedId
    private AuctionParamValuePK pk;

    private String value;

}

@Embeddable
public class AuctionParamValuePK {

    @ManyToOne
    @JoinColumn(name="auctionId")
    private Auction auction;

    @ManyToOne
    @JoinColumn(name="auctionParamId")
    private AuctionParam auctionParam;

}

Отображение ошибки: -

.Error-Details: -Exception Описание: Entity [класс com.eaportal.domain.AuctionParamValue]
использует [класс com.eaportal.domain.AuctionParamValuePK]
в качестве встроенного идентификатора класса
чей тип доступа было определено как [ПОЛЕ].
Но [учебный класс com.eaportal.domain.AuctionParamValuePK]
не определяет [ПОЛЯ]. это скорее всего, вы не предоставили
достаточно метаданных в вашем классе ID [учебный класс com.eaportal.domain.AuctionParamValuePK].

Если вы найдете решение, пожалуйста, дайте мне знать.

Заранее спасибо Tushar

Ответы [ 2 ]

2 голосов
/ 19 января 2011

Вы не можете использовать EmbeddedId со связями.Используйте IdClass.

@Entity
@IdClass(AuctionParamValuePK.class)
public class AuctionParamValue {

    @Id
    @ManyToOne
    @JoinColumn(name="auctionId")
    private Auction auction;

    @Id
    @ManyToOne
    @JoinColumn(name="auctionParamId")
    private AuctionParam auctionParam;

    @Basic
    private String value;

}

public class AuctionParamValuePK {

    private int auction;
    private int auctionParam;

}
0 голосов
/ 19 января 2011

Я думаю, что в вашем классе Auction есть некоторые ошибки.Вот как я должен выглядеть

@Entity
public class Auction {

    @Id
    private Integer auctionId;

    @OneToMany(mappedBy="auction") // not auctionId
    @MapKey(name="auctionParam") // not auctionParamId
    private Map<AuctionParam, AuctionParamValue> values;

}

(значения аннотаций должны соответствовать полям (или свойствам), а не столбцам)

...