Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on entities.Ques#tion.examId references an unknown entity: long

I'm trying to setup JPA with a hibernate implementation for the first time with this test project. Ran into the following error:

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: ExamModulePu] Unable to build EntityManagerFactory at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:924) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:899) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:59) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) at service.tests.ExamServiceTest.main(ExamServiceTest.java:18) Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on entities.Question.examId references an unknown entity: long at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:109) at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1536) at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1457) at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1365) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1756) at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:96) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914) 

These are my entities:

@Entity public class Exam implements Serializable {      @Id     @GeneratedValue(strategy = GenerationType.AUTO)     private long id;     private String name;     private int numQuestions;     private int minutesAllotted;     private Date startDate;     private Date endDate;     @OneToMany(mappedBy = "examId", orphanRemoval = true)     private List<Question> questionList;         // Getters and setters here.. }  @Entity public class Question implements Serializable{      @Id     @GeneratedValue(strategy=GenerationType.AUTO)     private long id;     @ManyToOne     private long examId;     private int points;     private int timeLimit;     private String text;     private String category;     @Embedded     private List<Answer> answerList; }  @Embeddable  public class Answer implements Serializable {      private int optionNumber;     private String text;     private boolean correct; } 

This is what my persistence.xml looks like:

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"     version="2.0">     <persistence-unit name="ExamModulePu"         transaction-type="RESOURCE_LOCAL">         <provider>org.hibernate.ejb.HibernatePersistence</provider>         <class>entities.Exam</class>         <class>entities.Question</class>         <exclude-unlisted-classes>false</exclude-unlisted-classes>         <properties>             <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />             <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/exammoduledb" />             <property name="javax.persistence.jdbc.user" value="root" />             <property name="javax.persistence.jdbc.password" value="root" />             <property name="hibernate.hbm2ddl.auto" value="create" />         </properties>     </persistence-unit> </persistence> 

I haven't created any of the tables, but instead am depending on the hibernate.hb2mddl.auto to do so. But I believe my error springs up even before that happens as it can't generate the persistence unit. Any ideas what I'm doing wrong? I'm making sure I import only javax.persistence.*;

like image 704
Vinay Bangalore Nagaraj Avatar asked Jun 12 '13 22:06

Vinay Bangalore Nagaraj


2 Answers

If you look closely at your stacktrace, you will see

Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on entities.Question.examId references an unknown entity: long 

So this field

@ManyToOne private long examId; 

is causing the problem. @ManyToOne has a paramater targetEntity which says:

(Optional) The entity class that is the target of the association. Defaults to the type of the field or property that stores the association.

Since you haven't provided that parameter, it defaults to long, which is not a managed Entity.

You'll probably want to use

@ManyToOne(targetEntity = Exam.class) private long examId; 

otherwise it won't know what to map to. Or even better

@ManyToOne private Exam exam; 
like image 157
Sotirios Delimanolis Avatar answered Oct 14 '22 03:10

Sotirios Delimanolis


Just add the class Team to the "hibernate-cfg.xml" file, because Hibernate doesn't identify without adding into it.

like image 37
Chintan Panchal Avatar answered Oct 14 '22 04:10

Chintan Panchal