解決 Hibernate Annotation 的 "no persistent classes found for query class" 問題
軟件版本:hibernate-3.2.0.cr2
hibernate-annotations-3.2.0.CR1
IDE:
idea 5.1
以前都是用XDoclet來實現類似Annotation的功能,但是xdoclet的版本更新實在太慢,永遠跟不上hibernate的更新速度,導致很多hibernate新的功能xdoclet都沒辦法支持.還好,jdk5.0有了Annotation,而且hibernate也開始支持Annotation了.
原來以為從xdoclet轉到Annotation很簡單,沒想到還是遇到了問題,先看代碼:
?1
package?test;
?2
?3
import?org.hibernate.annotations.Entity;
?4
?5
import?javax.persistence.Id;
?6
import?java.io.Serializable;
?7
?8
@Entity
?9
public?class?Flight?implements?Serializable
{
10
??Long?id;
11
??String?name;
12
13
??@Id
14
??public?Long?getId()
{
15
????return?id;
16
??}
17
18
??public?void?setId(Long?id)
{
19
????this.id=id;
20
??}
21
22
??public?String?getName()
{
23
????return?name;
24
??}
25
26
??public?void?setName(String?name)
{
27
????this.name=name;
28
??}
29
30
??public?boolean?equals(Object?o)
{
31
????if(this==o)?return?true;
32
????if(o==null||getClass()!=o.getClass())?return?false;
33
34
????final?Flight?flight=(Flight)o;
35
36
????if(id!=null?!id.equals(flight.id):flight.id!=null)?return?false;
37
????if(name!=null?!name.equals(flight.name):flight.name!=null)?return?false;
38
39
????return?true;
40
??}
41
42
??public?int?hashCode()
{
43
????int?result;
44
????result=(id!=null?id.hashCode():0);
45
????result=29*result+(name!=null?name.hashCode():0);
46
????return?result;
47
??}
48
}
49

?2

?3

?4

?5

?6

?7

?8

?9



10

11

12

13

14



15

16

17

18



19

20

21

22



23

24

25

26



27

28

29

30



31

32

33

34

35

36

37

38

39

40

41

42



43

44

45

46

47

48

49

看上去沒什么問題吧?沒想到運行的時候根本跑不起來,老是提示:


















看了半天看不出有什么問題,最后終于參考hibernate-annotations-3.2.0.CR1里面單元測試的代碼才發現是這段代碼有問題:
1
import?org.hibernate.annotations.Entity;
2
3
import?javax.persistence.Id;
4
import?java.io.Serializable;
5

2

3

4

5

要改成:
1
import?javax.persistence.Id;
2
import?javax.persistence.Entity;
3
import?java.io.Serializable;

2

3

原來我用idea開發時,在自動完成的時候想當然地選用了org.hibernate.annotations包下面的annotation,而實際上應該使用javax.persistence包下面的annotation.想想看也很有道理:這樣一來我們的JAVA bean就不用import hibernate的包了,用的都是標準的java包.