使用hibernate4.3.2+javaEE6.0運行時會報如下錯誤
Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:936)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:781)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3762)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3716)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
at util.HiberUtils.<clinit>(HiberUtils.java:16)
異常的意思是:在javax.persistence.Table這個類中沒有找到indexes()方法
研究半天發現是用註解方式生成表的時候 @Table(name = "user", catalog = "forum")就會拋出異常,
我用的是java EE 6.0, 查找javaEE 6.0的api發現沒有indexes()這個方法,
然後查閱java EE 7.0的api發現 有indexes()這個方法,
java EE 7.0 API:http://docs.oracle.com/javaee/7/api/
所以要想使用Hibernate 4.3中的@Table註解就需要用java EE 7.0
但是後來經過測試發現將@Table(name = "user", catalog = "forum") 改成@Entity(name = "user")錯誤也就不見了。
還有一個奇怪的問題,如果不用main方法和Junit測試獲取session,直接在jsp頁面進行CRUD操作就不會拋出異常
解決辦法:
方法一:
如果你是WEB開發,則可以忽略這個異常。直接在jsp頁面操作
方法二:
將@Table(name = "user", catalog = "forum") 改成@Entity(name = "user")
方法三:
將java EE 6.0 換成java EE 7.0