使用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