Embedded ID class should not contain relationship mappings

2 respostas
lucmargarida

apresenta este erro na anotação @EmbeddedId em algumas classes de entidades. sei que se removo as anotações de mapping da Pk dessas classes sano o problema mas nao entendi o porque. Alguem poderia me explicar onde estou errado por gentileza?

por exemplo, essa é entidade ocorrencia
/**
 * The persistent class for the occurrence database table.
 * 
 */
@Entity
@Table(name = OccurrenceConstant.OCCURRENCE)
public class Occurrence extends OccurrenceConstant implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    OccurrencePK id;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = OCCURRENCE_DATE_SCAN)
    private Date occurrenceDateScan;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = OCCURRENCE_DATE_CREATION)
    private Date occurrenceDateCreation;

    @Temporal(TemporalType.DATE)
    @Column(name = OCCURRENCE_DATE_TRT)
    private Date occurrenceDateTrt;

    // bi-directional many-to-one association to Image
    @OneToMany(mappedBy = OCCURRENCE, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<Image> images;

    @Lob()
    @Column(name = OCCURRENCE_NOTE)
    private String occurrenceNote;

    @Column(name = OCCURRENCE_STATE, nullable = false)
    private Short occurrenceState;

    @Column(name = OCCURRENCE_TYPE)
    private Long occurrenceType;

    @Column(name = OCCURRENCE_VALUE_ENVELOPE)
    private String occurrenceValueEnvelope;

    @Column(name = OCCURRENCE_TERMINAL_NUMBER)
    private Integer occurrenceTerminalNumber;

    // bi-directional many-to-one association to Account
    @ManyToOne
    @JoinColumn(name = OCCURRENCE_ACCOUNT_ID, nullable = true)
    private Account account;

    // bi-directional many-to-one association to Site
    @ManyToOne
    @JoinColumn(name = OCCURRENCE_AGENCY_SOURCE, nullable = true)
    private Agency occurrenceAgencySource;

    @OneToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = OCCURRENCE_ID, referencedColumnName = OccurrenceTmpConstant.OCCURRENCE_TMP_ID, insertable = false, updatable = false, nullable=true),
        @JoinColumn(name = OCCURRENCE_SITE, referencedColumnName = OccurrenceTmpConstant.OCCURRENCE_TMP_SITE, insertable = false, updatable = false, nullable=true)
    })
    private OccurrenceTmp occurrenceTmp;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = OCCURRENCE_LOCK_CREATION)
    private Date occurrenceLockCreation;

    @Column(name = OCCURRENCE_AMOUNT)
    private Integer occurrenceAmount;
    
    public Occurrence() {
    }

e esta a sua PK

/**
 * The primary key class for the image database table.
 * 
 */
@Embeddable
public class OccurrencePK extends OccurrenceConstant implements Serializable {
    // default serial version id, required for serializable classes.
    private static final long serialVersionUID = 1L;

    @Column(name = OCCURRENCE_ID, unique = true, nullable = false)
    private Integer occurrenceId;

    // bi-directional many-to-one association to Occurrence
    @ManyToOne
    @JoinColumn(name = OCCURRENCE_SITE, unique = true, nullable = false)
    private Site occurrenceSite;

    public OccurrencePK() {
    }

    public OccurrencePK(int occId, Site site) {
        this.occurrenceId = occId;
        this.occurrenceSite = site;
    }

    public int getOccurrenceId() {
        return occurrenceId;
    }

    public void setOccurrenceId(Integer occurrenceId) {
        this.occurrenceId = occurrenceId;
    }

    public Site getOccurrenceSite() {
        return occurrenceSite;
    }

    public void setOccurrenceSite(Site occurrenceSite) {
        this.occurrenceSite = occurrenceSite;
    }

    public OccurrencePK(Integer imageId, Site imageSite) {
        if (imageId != null)
            setOccurrenceId(imageId);
        if (imageSite != null)
            setOccurrenceSite(imageSite);
    }

2 Respostas

lucmargarida

Consegui solucionar, na verdade de forma bem simples a anotação embeddedId nao permite anotaçãoe de mapeamento na classe PK. entao removi as anotações de manyToOne e substitui JoinColumns por Column. Alguem poderia me explicar essa anoptação @EmbeddedId??? Obrigada

G

As anotações ManyToOne você deve adicionar na classe que extende a PK, mas na anotação JoinColumn você deve colocar nas propriedades insert e update os valores false, pois a classe PK é quem vai fazer isso, então essa anotaçao ManyToOne vai ser apenas para leitura.

[]'s

Criado 5 de outubro de 2012
Ultima resposta 11 de out. de 2012
Respostas 2
Participantes 2