2013-06-12 8 views
23

Bu test projesi ile ilk kez bir hazırda bekletme uygulaması ile JPA kurmaya çalışıyorum. şu hata Ran: Ben herhangi oluşturmadığınızdanorg.hibernate.AnnotationException: @OneToOne veya @ManyToOne üzerinde entities.Ques # tion.examId bilinmeyen bir varlığı referanslar: uzun

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

:

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

Bu gibi benim persistence.xml görünür:

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) 

Bunlar benim varlıklardır tablolar, ancak bunun yerine hibernate.hb2mddl.auto bağlıyım. Ama inanıyorum ki hatam, ısrarcı birimin üretilememesi nedeniyle gerçekleşmeden önce yayılıyor. Yanlış yaptığım herhangi bir fikrin var mı? Ben verdiğimden emin size stacktrace yakından bakarsanız sadece javax.persistence.*;

cevap

52

içe, sen Yani bu alan

@ManyToOne 
private long examId; 

soruna neden olan

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

göreceksiniz. @ManyToOne diyen bir parametrenin yeni targetEntity vardır:

Yönetilen Entity olmadığını parametreyi, long için varsayılan olarak, sağlamadıysanız yana

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

.

Muhtemelen aksi takdirde eşleme ne bilemezsiniz

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

kullanmak isteyeceksiniz. Hazırda içine eklemeden tanımlamaz çünkü Hatta daha da iyisi

@ManyToOne 
private Exam exam; 
12

Sadece "hazırda cfg.xml" dosyasına sınıf Takımı'nı ekleyin.

@org.hibernate.annotations.Entity 

ve JPA ek açıklama:

Açıkça içe:

Düzenleme

@javax.persistence.Entity 

karışık bir hazırda ek açıklama varsa

8

Bilginize, bu bazen olur javax ek açıklaması.

+1

urgroon @ urffeJunky nedir? – sisimh

+0

Onun önerisi, yalnızca "org.hibernate.annotations.Entity" yerine "javax.persistence.Entity" ifadesini almaktır. –

+0

Bu, programım için geçerli değil ama hala hata veriyor – Avdhut