Hibernate错误或不正确的映射(这可能表示Hibernate-ERROR中的错误)?

时间:2016-06-05 04:18:13

标签: java hibernate jpa

当我运行以下程序时,我得到以下异常:

  

错误:HCANN000002:发生断言失败(这可能表示a   Hibernate中的错误)org.hibernate.annotations.common.AssertionFailure:   在继承状态层次结构中找不到声明类:   com.online.tutorial.elementCollection.map.LanguageStatement5

我运行以下see documentation

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;
    }
}

JUnit课程:

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;
    }
}

另一个POJO课程:

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文件:

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

1 个答案:

答案 0 :(得分:2)

如果LanguageStatement5是一个实体类型 - 正如@Id所建议的那样,并且你试图直接用实体管理器来保存它的实例 - 它应该被声明为:你应该注释它使用@Entity而不是@Embeddable。后者用于持久化由其他实体“拥有”的类,并且没有自己的生命周期和标识(@Id)。这也意味着您必须将languageNameToQuestionMap的{​​{1}}属性的映射从Question5更改为@ElementCollection

或者,如果@OneToMany在概念上确实是嵌入式实体,则不应尝试将那些实例持久化。只需调用LanguageStatement5,JPA将注意保留语言语句对象。这应该是您代码中entityManager.persist(dateOfBirthQuestion5);的唯一调用。在这种情况下,您还应该从persist删除@SequenceGenerator@Id