2011-04-06 4 views
1

EclipseLink a généré une instruction create table comme ceci:EclipseLink + JPA génère colonne ID inattendue

Create Table myTable (ID (255) not null, col1 (255), col2(255), col3(255) PK (ID, col1, col2) 



@Embeddable 
MyPK implements Serializable 
{ 
    @OneToOne 
    @Id 
    String col1; 

    @OneToOne 
    @Id 
    String col2;  
... 
} 



@Entity 
MyClass implements Serializable 
{ 
    @EmbeddedId 
    MyPK pk; 
    String col1; 
    String col2; 
    String col3; 
... 
} 

Comment puis-je éviter la génération de la colonne ID dans la déclaration Create Table? Je demande parce que em.persist(MyClass) lève une exception de contrainte sur ID étant nulle. Je m'attendais à ce que le @EmbeddedId remplace cela et empêche la création de ce champ.

EDIT
Le tableau que je suis en train de générer dans le code ressemble à ceci:

fk - col1 
fk - col2 
VarChar - col3 
+0

'Chaînes' clés étrangères? –

+0

@Matt oui, en effet mon ami. – user123435234234234

Répondre

2

Le premier numéro est un attribut de chaîne ne peut pas être un mappage de ONEtoONE. Deuxièmement, un mappage OneToOne ne peut pas être utilisé dans un EmbeddedId. Troisièmement, vous n'utilisez pas l'annotation @Id dans un EmbeddedId car un Embedded ne peut pas avoir d'identité.

La meilleure façon de le faire est la suivante:

@Entity 
@IdClass(MyPK.class) 
MyClass implements Serializable 
{ 
    @OneToOne 
    @Id 
    TargetClass rel1; 

    @OneToOne 
    @Id 
    SecondTargetClass rel2 

    @Basic 
    String col3; 
... 
} 

MyPK implements Serializable 
{ 
    String rel1; 

    String rel2;  
... 
} 

Si vous avez vraiment besoin d'un intégrable pour la classe pk remplacent alors l'annotation @ID avec @MapsId et ajoutez l'annotation EmbeddedId retour dans MyClass et l'annotation intégrable retour à MyPK

+0

Merci c'était exactement ce qui était nécessaire – user123435234234234