2016-08-03 4 views
0

Je dois créer sur la clé primaire composite qui aura une clé étrangère ComponentMarks Classe:clé primaire composite avec 1 JPA clé étrangère, TopLink

@IdClass(SubQuesCompIDs.class) 
@Entity 
@Table(name="component_marks") 

public class ComponentMarks { 
    @Id 
    private String component_ID; 
    @Id 
    private String question_ID; 
    @Id 
    @ManyToOne(targetEntity=ConsolidatedMarks.class) 
    @JoinColumn(name="submission_unique_ID", referencedColumnName="submission_unique_ID") 
    private ConsolidatedMarks consolidatedMarks; 
//***********getters and setters*********** 
} 

SubQuesCompIDs Classe:

public class SubQuesCompIDs implements Serializable{ 

    private ConsolidatedMarks consolidatedMarks; 
    private String component_ID; 
    private String question_ID; 
/****************getters and setter************/ 
} 

ConsolidatedMarks classe :

public class ConsolidatedMarks { 
    @Id 
    private String submission_unique_ID; 
    /****************getters and setter************/ 
    } 

erreur:

Internal Exception: javax.persistence.PersistenceException: Exception [TOPLINK-28018] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.EntityManagerSetupException 
    Exception Description: predeploy for PersistenceUnit [RDEVAL_MySQL_DB] failed. 
    Internal Exception: Exception [TOPLINK-7150] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))):  oracle.toplink.essentials.exceptions.ValidationException 
     Exception Description: Invalid composite primary key specification. The names of the primary key fields or properties in the primary key class [com.eta.entityBeans.SubQuesCompIDs] and those of the entity bean class [class com.eta.entityBeans.ComponentMarks] must correspond and their types must be the same. Also, ensure that you have specified id elements for the corresponding attributes in XML and/or an @Id on the corresponding fields or properties of the entity class. 
    java.lang.Exception: 
    Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: WebappClassLoader 
    context: /ProjectName ** 
    delegate: false 
    ----------> Parent Classloader: 
    [email protected] 

    Internal Exception: javax.persistence.PersistenceException: Exception [TOPLINK-28018] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.EntityManagerSetupException 
    Exception Description: predeploy for PersistenceUnit [RDEVAL_MySQL_DB] failed. 
    Internal Exception: Exception [TOPLINK-7150] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.ValidationException 
     Exception Description: Invalid composite primary key specification. The names of the primary key fields or properties in the primary key class [com.eta.entityBeans.SubQuesCompIDs] and those of the entity bean class [class com.eta.entityBeans.ComponentMarks] must correspond and their types must be the same. Also, ensure that you have specified id elements for the corresponding attributes in XML and/or an @Id on the corresponding fields or properties of the entity class. 

et aussi dans la classe java "ComponentMarks" à "@IdClass (SubQuesCompIDs.class)", il montrait cette compilation message d'erreur:

The attribute matching the ID class attribute consolidatedMarks does not have the correct type com.eta.entityBeans.ConsolidatedMarks 

ConsolidatedMarks est du paquet com.eta.entityBeans.

Mise à jour ComponentMarks:

@Entity 
@Table(name="component_marks") 
@IdClass(SubQuesCompIDs.class) 
public class ComponentMarks { 
    @Id 
    private String component_ID; 
    @Id 
    private String question_ID; 
    @Id 
    @Column(name="submission_unique_ID") 
    @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="submission_unique_ID") 
    private ConsolidatedMarks consolidatedMarks; 
    /****************getters and setter************/ 
    } 

SubQuesCompIDs mise à jour:

public class SubQuesCompIDs implements Serializable{ 
    private String consolidatedMarks; 
    private String component_ID; 
    private String question_ID; 
    /****************getters and setter************/ 
    } 

maintenant la deuxième erreur qui est une erreur de compilation n'est pas comming.

Répondre

0

Ceci est une "identité dérivée".

Votre @IdClass devrait ressembler à ceci:

public class SubQuesCompIDs implements Serializable{ 

    private String consolidatedMarks; 
    private String component_ID; 
    private String question_ID; 
/****************getters and setter************/ 
} 

Notez le champ correspondant au champ @ManyToOneconsolidatedMarks a le même nom de domaine, mais son type correspond au type du champ clé primaire ConsolidatedMarks.

Les identités dérivées sont traitées dans la spécification JPA 2.1, section 2.4.1.

+0

Merci d'avoir répondu. J'ai modifié mon code en fonction de vos sugeessions mais j'ai la même erreur ' " Spécification de clé primaire composite non valide Les noms des champs de clé primaire ou des propriétés dans la classe de clé primaire [com.eta.entityBeans.SubQuesCompIDs] et ceux de la classe bean entité [classe com.eta.entityBeans.ComponentMarks] doit correspondre et leurs types doivent être identiques.Aussi, assurez-vous que vous avez spécifié des éléments id pour les attributs correspondants en XML et/ou un @Id sur les champs correspondants ou les propriétés de la classe d'entité "' –

+0

J'ajoute aussi mon code de création de table. CREATE TABLE 'component_marks' ( \t' submission_unique_ID' VARCHAR (50) NOT NULL, \t 'component_ID' VARCHAR (30) NOT NULL, \t' question_ID' VARCHAR (30) NOT NULL); –

+0

Je ne suis pas sûr que cela provoque l'erreur, mais vous ne devriez pas avoir l'annotation '@Column (name =" submission_unique_ID ")' sur le champ 'consolidatedMarks'. –