org.hibernación.AnnotationException: @OneToOne o @ManyToOne en entidades.Pregunta # tion.examId hace referencia a una entidad desconocida: largo


Estoy tratando de configurar JPA con una implementación de hibernación por primera vez con este proyecto de prueba. Se encontró con el siguiente 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)

Estas son mis entidades:

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

Esto es lo que mi persistencia.xml se ve así:

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

No he creado ninguna de las tablas, pero en cambio estoy dependiendo de la hibernate.hb2mddl.auto para hacerlo. Pero creo que mi error surge incluso antes de que eso suceda, ya que no puede generar la unidad de persistencia. ¿Alguna idea de lo que estoy haciendo mal? Me estoy asegurando de que importar solo javax.persistence.*;

Author: Maarten Bodewes, 2013-06-13

3 answers

Si miras de cerca a tu stacktrace, verás{[9]]}

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

Así que este campo

@ManyToOne
private long examId;

Está causando el problema. @ManyToOne tiene un parámetro targetEntity que dice:

(Opcional) La clase de entidad que es el objetivo de la asociación. El valor predeterminado es el tipo del campo o propiedad que almacena la asociación.

Dado que no ha proporcionado ese parámetro, el valor predeterminado es long, que no es un Entity administrado.

Probablemente quieras usar

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

De lo contrario no sabrá a qué mapear. O incluso mejor

@ManyToOne
private Exam exam;
 59
Author: Sotirios Delimanolis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-12 22:48:13

Simplemente agregue la clase Team al "hibernate-cfg.archivo xml", porque Hibernate no se identifica sin añadirlo.

 12
Author: Chintan Panchal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-03 06:43:34

Para su información, esto a veces sucede si tiene una anotación de hibernación:

@org.hibernate.annotations.Entity

Y una anotación del APP:

@javax.persistence.Entity 

Mezclado

Editar:

Importa explícitamente la anotación javax.

 9
Author: CoffeJunky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-15 14:20:08