当我运行以下程序时,我得到以下异常:
错误: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>
答案 0 :(得分:2)
如果LanguageStatement5
是一个实体类型 - 正如@Id
所建议的那样,并且你试图直接用实体管理器来保存它的实例 - 它应该被声明为:你应该注释它使用@Entity
而不是@Embeddable
。后者用于持久化由其他实体“拥有”的类,并且没有自己的生命周期和标识(@Id
)。这也意味着您必须将languageNameToQuestionMap
的{{1}}属性的映射从Question5
更改为@ElementCollection
。
或者,如果@OneToMany
在概念上确实是嵌入式实体,则不应尝试将那些实例持久化。只需调用LanguageStatement5
,JPA将注意保留语言语句对象。这应该是您代码中entityManager.persist(dateOfBirthQuestion5);
的唯一调用。在这种情况下,您还应该从persist
删除@SequenceGenerator
和@Id
。