2015-04-01 110 views
2

我使用最新的Spring框架4.1.5和Hibernate-Entity-Manager 4.3.8以及Javax。 Persistence-api 1.0.2全部使用JPA 2.1。这个规范依赖于Java EE 7.我注意到,在Resin 4.0.42中,它使用“javaee-16.jar”。问题是我收到以下异常:如何在Resin 4.0.42中加载Java EE 7并且不使用默认的Javaee-16.jar类默认加载

Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes() 
[Ljavax/persistence/Index; 
    at 
    org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:973) 
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:824) 
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845) 


Method javax.persistence.Table.indexes() only exists in Java EE 7  
(Javax.Persistence-api 1.0.2) as a JPA 2.1 spec and NOT in Java EE 6 as a 
JPA 2.0 spec. 

问题是我的代码基于JPA 2.1。是否有反正我可以classload

<dependency> 
<groupId>javax</groupId> 
<artifactId>javaee-api</artifactId> 
<version>7.0</version> 
</dependency> 

即使树脂已经classloaded:javaee-16.jar第一次?

回答

1

得到它的工作,我首先加载孩子库,而不是其他的方式。树脂正在装载母亲先。我注意到其他人在仅实现JPA 2.0的应用服务器上实现JPA 2.1时遇到了同样的挑战。关键是每个应用服务器都有自己特定的方式来首先配置子库(或你的应用的库)。

在我的情况,在Resin.xml,添加以下:

<class-loader> 
    <servlet-hack/> 
</class-loader> 
+0

您好,我尝试,但树脂的琥珀(树脂的JPA 1.0实现)抱怨'<持久的xm​​lns =“http://xmlns.jcp .org/xml/ns/persistence“>是persistence.xml中的一个意外的顶级标记。这是JPA 2.1的命名空间。你是如何摆脱它的? (树脂4.0.43) – smallufo 2015-04-07 10:33:22

+0

使用JPA注释,它应该工作。这个对我有用。 – logixplayer 2015-05-07 04:09:40