2015-10-15 9 views
5

Nella mia attuale implementazione ho classi entità separate per ogni tabella db. Sto usando JPA insieme a eclipselink-2.5.2. Funziona bene per me ma a un certo punto quando i dati sono enormi, è in ritardo. Ecco perché ho deciso di iniziare a utilizzare @ Embedded, @ Embeddable e @ Embedded ID. Mentre sto facendo questo, sto ricevendo un errore che è molto strano per me. Ecco lo stacktrace completo pubblicato: https://gist.githubusercontent.com/tjDudhatra/b955812e0d1a71cf97f1/raw/11ea458869e24baae744530417ac99bc877ed514/gistfile1.txtStrano problema durante la configurazione dei tipi di ID per la classe incorporabile in EclipseLink-2.5.2

Essendo specifico, consentitemi di fornirvi lo scenario esatto, nel qual caso ricevo l'eccezione. Considera questo blocco di codice che ha tre classi. Uno è annotato come @Entity e altri due sono annotati come @Embeddable. So che in una classe non possiamo definire @Id e EmbeddedId e non ho fatto così, quindi anche durante la distribuzione del server, io sono sempre l'eccezione che dice solo:

[classe org.apache . {} SomeClass] ha sia un @EmbdeddedId (su attributo [id]) e un @Id (su attributo []. entrambi i tipi di identificazione non è possibile specificare sulla stessa entità.

@Entity 
@Table(name="user") 
public class User { 

    @ID 
    public Long id; 

    @Column(name="userCode") 
    public String userCode; 

    @ElementCollection 
    @CollectionTable(name = "address", joinColumns = @JoinColumn(name = "user_id")) 
    public List<Address> addressList; 

    .... 
} 

@Embeddable 
public class Address { 

    @EmbeddedId 
    @Column(name = "id") 
    public Long id; 

    @Column(name="userId") 
    public Long userId; 

    @Column(name="address-line-1") 
    public String addressLine1; 

    @Column(name="address-line-2") 
    public String addressLine2; 

    @ElementCollection 
    @CollectionTable(name = "phone", joinColumns = @JoinColumn(name = "user_id")) 
    protected List<Phone> phoneList; 

    .... 
} 

@Embeddable 
public class Phone { 

    @EmbeddedId 
    @Column(name = "id") 
    public Long id; 

    @Column(name="contact_no") 
    public String contactNo; 

    @Column(name="country_code") 
    public int countryCode; 

    @Column(name="address_id") 
    public int addressId; 

    .... 
} 

prega fammi sapere se sono necessari più dettagli e qualsiasi tipo di aiuto sarà molto apprezzato.

Grazie,

+0

Ohh mi scuso, è EclipseLink-2.5.2 –

risposta

3

Quindi, ho trovato il problema. Ho fatto alcune analisi e ho avuto maggiori informazioni su embeddable e elementCollection. Ecco il riferimento: https://en.wikibooks.org/wiki/Java_Persistence/ElementCollection

Così ora ho modificato il codice di conseguenza e sta funzionando bene ora. Questo è il modo che ho fatto il lavoro:

@Entity 
@Table(name="user") 
public class User { 

    @ID 
    public Long id; 

    @Column(name="userCode") 
    public String userCode; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "user_id") 
    public List<Address> addressList; 

    .... 
} 

@Entity 
@Table(name="address") 
public class Address { 

    @Id 
    @Column(name = "id") 
    public Long id; 

    @Column(name="userId") 
    public Long userId; 

    @Column(name="address-line-1") 
    public String addressLine1; 

    @Column(name="address-line-2") 
    public String addressLine2; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "address_id") 
    protected List<Phone> phoneList; 

    .... 
} 

@Entity 
@Table(name="phone") 
public class Phone { 

    @Id 
    @Column(name = "id") 
    public Long id; 

    @Column(name="contact_no") 
    public String contactNo; 

    @Column(name="country_code") 
    public int countryCode; 

    @Column(name="address_id") 
    public int addressId; 

    .... 
} 
3

Una classe annotata @Embeddable non deve contenere alcun @EmbeddedId.

@EmbeddedId consente di annotare un campo di tipo @Embeddable in un'altra classe e contrassegnarlo come chiave primaria.

Esempio:

@Entity 
public class Project { 
    @EmbeddedId ProjectId id; 
    ... 
} 

@Embeddable 
Class ProjectId { 
    int departmentId; 
    long projectId; 
    ... 
} 

EDIT: nel tuo caso, non credo che si desidera Phone, nè Address per essere @Embeddable. Basta contrassegnarli come regolari @Entity.

+0

Grazie per la risposta, ma può spiegarci che se io non annotare telefono e la classe di indirizzo con atEmbeddable allora funzionerà? Voglio dire, se voglio incorporare una raccolta di alcune classi, allora quella classe deve essere annotata come in Embedded, giusto? Correggimi se sbaglio. –

+2

No, '@ Embeddable' è davvero per una classe che funge da chiave. Il tuo schema di database è stato riparato? In tal caso, fornire le tabelle per Utente, Indirizzo e collegamento tra di esse; –

+1

Ora ho chiaro il concetto, grazie .. –

Problemi correlati