このテストプロジェクトで初めてJPAを休止状態の実装でセットアップしようとしています。次のエラーが発生しました。
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)
これらは私のエンティティです:
@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;
}
これは私のpersistence.xmlのようです:
<?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>
テーブルを作成していませんが、その代わりにhibernate.hb2mddl.auto
に依存しています。しかし、永続性ユニットを生成できないため、エラーが発生する前でもエラーが発生すると考えています。私が間違っていることは何ですか? javax.persistence.*;
のみをインポートしていることを確認しています
スタックトレースをよく見ると、
Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on entities.Question.examId references an unknown entity: long
だからこのフィールド
@ManyToOne
private long examId;
問題を引き起こしています。 @ManyToOne
にはtargetEntity
というパラメータがあります。
(オプション)関連付けのターゲットであるエンティティクラス。デフォルトでは、関連付けを保存するフィールドまたはプロパティのタイプになります。
そのパラメーターを指定していないため、デフォルトではlong
になりますが、これは管理対象Entity
ではありません。
あなたはおそらく使いたいでしょう
@ManyToOne(targetEntity = Exam.class)
private long examId;
そうしないと、マップ先がわかりません。またはさらに良い
@ManyToOne
private Exam exam;
クラスTeamを「hibernate-cfg.xml」ファイルに追加するだけです。Hibernateは追加しないと識別されないためです。
参考までに、これは、休止状態の注釈がある場合に時々発生します。
@org.hibernate.annotations.Entity
およびJPAアノテーション:
@javax.persistence.Entity
混同
編集:
Javaxアノテーションを明示的にインポートします。