2016-06-05 3 views
1

Wenn ich das unten Programm ausführen, bekomme ich die folgende Ausnahme:Hibernate Bug oder falsches Mapping (dies könnte auf einen Fehler im Hibernate-ERROR hindeuten)?

ERROR: HCANN000002: An assertion failure occurred (this may indicate a bug in Hibernate) org.hibernate.annotations.common.AssertionFailure: Declaring class is not found in the inheritance state hierarchy: com.online.tutorial.elementCollection.map.LanguageStatement5

Ich betreibe die unter JUnit:

public class QuestionDataSetup5 { 

    @Test 
    public void testQuestionDataSetup(){ 
     String hindiString = new String("Hindi"); 
     String englishString = new String("English"); 
     String chineseString = new String("chinese"); 

     LanguageStatement5 hindiStatement = new LanguageStatement5("बिल गेट्स के जन्म की तारीख क्या है"); 
     LanguageStatement5 englishStatement = new LanguageStatement5("What is the date of Birth of Bill Gates"); 
     LanguageStatement5 ChineseStatement = new LanguageStatement5("什么是比尔·盖茨出生日期"); 

     Map<String, LanguageStatement5> questionMap5 = prepareMap(hindiString, englishString, chineseString, hindiStatement, englishStatement, ChineseStatement); 

     Question5 dateOfBirthQuestion5 = new Question5(10, questionMap5); 

     EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("NewPersistenceUnit"); 
     EntityManager entityManager = entityManagerFactory.createEntityManager(); 
     entityManager.getTransaction().begin(); 

     entityManager.persist(hindiStatement); 
     entityManager.persist(englishStatement); 
     entityManager.persist(ChineseStatement); 

     entityManager.persist(dateOfBirthQuestion5); 

     entityManager.getTransaction().commit(); 
    } 

    private Map<String, LanguageStatement5> prepareMap(String hindiString, String englishString, String chineseString, LanguageStatement5 hindiStatement, LanguageStatement5 englishStatement, LanguageStatement5 chineseStatement) { 
     Map<String, LanguageStatement5> questionMap5 = new HashMap<String, LanguageStatement5>(); 
     questionMap5.put(hindiString, hindiStatement); 
     questionMap5.put(englishString, englishStatement); 
     questionMap5.put(chineseString, chineseStatement); 
     return questionMap5; 
    } 
} 

POJO Klassen:

package com.online.tutorial.elementCollection.map; 

import javax.persistence.*; 
import java.util.Map; 
import java.util.TreeMap; 

@Entity 
@Table(name = "Question5") 
public class Question5 { 

    @Id 
    @SequenceGenerator(name = "question_sequencer_generator", sequenceName = "question_sequencer" , initialValue = 10, allocationSize = 50) 
    @GeneratedValue(generator = "question_sequencer_generator", strategy = GenerationType.SEQUENCE) 
    @Column(name = "question_id") 
    private Long questionId; 

    @Column(name = "Max_Marks") 
    private int maxMarks; 

    @ElementCollection 
    @CollectionTable(name = "IMAGE") 
    @MapKeyJoinColumn(name = "LANGUAGE_REF_ID") 
    /* @JoinTable(name = "QUESTION_STATEMENT_MAPPING", 
         joinColumns = @JoinColumn(name = "QUESTION_REF_ID"), 
         inverseJoinColumns = @JoinColumn(name =  "STATEMENT_REF_ID")) */ 
    private Map<String, LanguageStatement5> languageNameToQuestionMap = new TreeMap<String, LanguageStatement5>(); 

    public Question5() { 
    } 

    public Question5(int maxMarks, Map<String, LanguageStatement5> languageNameToQuestionMap) { 
     this.maxMarks = maxMarks; 
     this.languageNameToQuestionMap = languageNameToQuestionMap; 
    } 

    public Long getQuestionId() { 
     return questionId; 
    } 

    public void setQuestionId(Long questionId) { 
     this.questionId = questionId; 
    } 

    public int getMaxMarks() { 
     return maxMarks; 
    } 

    public void setMaxMarks(int maxMarks) { 
     this.maxMarks = maxMarks; 
    } 

    public Map<String, LanguageStatement5> getLanguageNameToQuestionMap() { 
     return languageNameToQuestionMap; 
    } 

    public void setLanguageNameToQuestionMap(Map<String, LanguageStatement5> languageNameToQuestionMap) { 
     this.languageNameToQuestionMap = languageNameToQuestionMap; 
    } 
} 

Eine weitere POJO Klasse:

package com.online.tutorial.elementCollection.map; 

import javax.persistence.*; 

@Embeddable 
public class LanguageStatement5 { 

    @Id 
    @SequenceGenerator(name = "statement_sequencer_generator", sequenceName = "statement_sequencer" , initialValue = 10, allocationSize = 50) 
    @GeneratedValue(generator = "statement_sequencer_generator", strategy = GenerationType.SEQUENCE) 
    @Column(name = "statement_id") 
    private Long statementId; 


    @Column(name = "statement") 
    private String statement; 

    public LanguageStatement5() { 
    } 

    public LanguageStatement5(String statement) { 
     this.statement = statement; 
    } 

    public String getStatement() { 
     return statement; 
    } 

    public void setStatement(String statement) { 
     this.statement = statement; 
    } 
} 

pom.xml-Datei:

<dependencies> 

    <dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>ojdbc14</artifactId> 
     <version>14</version> 
    </dependency> 
    <!-- http://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api --> 
    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.1-api</artifactId> 
     <version>1.0.0.Final</version> 
    </dependency> 

    <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate-core --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.3.2.Final</version> 
    </dependency> 

    <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>4.3.2.Final</version> 
    </dependency> 

    <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate-validator --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>4.3.2.Final</version> 
    </dependency> 

    <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate-annotations --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.5.6-Final</version> 
    </dependency> 

    <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate</artifactId> 
     <version>3.5.4-Final</version> 
     <type>pom</type> 
    </dependency> 

    <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-ehcache</artifactId> 
     <version>4.3.2.Final</version> 
    </dependency> 

    <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-c3p0</artifactId> 
     <version>4.3.2.Final</version> 
    </dependency> 

    <!-- http://mvnrepository.com/artifact/junit/junit --> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
    </dependency> 

Antwort

1

Wenn LanguageStatement5 ist ein Entitätstyp - wie von @Id und der Tatsache, schlug vor, dass Sie versuchen, ihre Instanzen direkt mit dem Unternehmen Manager bestehen bleiben - als solche deklariert werden soll: Sie sollten es mit @Entity und nicht mit @Embeddable kommentieren. Letzteres wird dazu verwendet, Klassen beizubehalten, die anderen Entitäten "gehören" und keinen eigenen Lebenszyklus und keine eigene Identität haben (@Id). Dies bedeutet auch, dass Sie die Zuordnung der languageNameToQuestionMap Eigenschaft von Question5 von @ElementCollection zu @OneToMany ändern müssen.

Alternativ, wenn LanguageStatement5 in der Tat konzeptionell eine eingebettete Entität ist, sollten Sie nicht versuchen, diese Instanzen zu erhalten. Rufen Sie einfach entityManager.persist(dateOfBirthQuestion5); an und JPA wird dafür sorgen, dass die Sprachanweisungen beibehalten werden. Dies sollte der einzige Aufruf an persist in Ihrem Code sein. Sie sollten in diesem Fall auch @SequenceGenerator und @Id von LanguageStatement5 entfernen.