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

78,643

Solution 1

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;

Solution 2

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

Solution 3

FYI, this sometimes happens if you have a hibernate annotation:

@org.hibernate.annotations.Entity

and a JPA annotation:

@javax.persistence.Entity 

mixed up

Edit:

Explicitly import the javax annotation.

Solution 4

It took me hours to find the actual issue

I had forgotten the @Entity annotation on the Parent class and the error use to show on the child class.

Share:
78,643
Vinay Bangalore Nagaraj
Author by

Vinay Bangalore Nagaraj

Updated on July 09, 2022

Comments

  • Vinay Bangalore Nagaraj
    Vinay Bangalore Nagaraj almost 2 years

    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.*;

  • sisimh
    sisimh almost 9 years
    what is ur suggestion @CoffeJunky ?
  • Monkey Supersonic
    Monkey Supersonic about 7 years
    His suggestion is to exclusively import javax.persistence.Entity instead of org.hibernate.annotations.Entity.
  • Avdhut
    Avdhut over 6 years
    This is not the in case of my program but still giving error
  • CoffeJunky
    CoffeJunky over 6 years
    Is it the exact same error message? Could you share your source code?
  • akasha
    akasha almost 5 years
    Or in persistance.xml.