2016-08-03 2 views
0

мне нужно создать на составной первичный ключ, который будет иметь один внешний ключ ComponentMarks Класс:Составной первичный ключ с 1 внешнего ключа JPA, 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 класса:

public class SubQuesCompIDs implements Serializable{ 

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

ConsolidatedMarks класса :

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

ошибка:

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. 

, а также в Java-класса "ComponentMarks" в "@IdClass (SubQuesCompIDs.class)" это показывало сообщение об ошибке компиляции:

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

ConsolidatedMarks это из пакета com.eta.entityBeans.

Update 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:

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

теперь вторая ошибка, ошибка компиляции не пришедшего.

ответ

0

Это «производная идентичность».

Ваш @IdClass должен выглядеть следующим образом:

public class SubQuesCompIDs implements Serializable{ 

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

Обратите внимание на поле, соответствующее поле @ManyToOneconsolidatedMarks имеет то же имя поля, но его тип совпадает с типом поля первичного ключа ConsolidatedMarks.

Производные идентификаторы обсуждаются в спецификации JPA 2.1, раздел 2.4.1.

+0

Благодарим вас за ответ. Я изменил свой код в соответствии с требованиями su sugeessions, но получаю ту же ошибку ' " Недопустимая составная спецификация первичного ключа. Имена полей или свойств первичного ключа в классе первичного ключа [com.eta.entityBeans.SubQuesCompIDs] и те из класса bean класса [класс com.eta.entityBeans.ComponentMarks] должны соответствовать, и их типы должны быть одинаковыми. Также убедитесь, что вы указали элементы id для соответствующих атрибутов в XML и/или @Id в соответствующих полях или свойства класса сущности "' –

+0

Я также добавляю код создания таблицы. 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

Я не уверен, что это вызывает ошибку, но вы не должны иметь аннотацию '@Column (name =" submission_unique_ID ")' в поле 'unitedMarks'. –

Смежные вопросы