首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建bean持久性时出错,NoSuchMethodError: javax/ entityManagerFactory /Table.index

创建bean持久性时出错,NoSuchMethodError: javax/ entityManagerFactory /Table.index
EN

Stack Overflow用户
提问于 2016-08-27 09:25:59
回答 1查看 1.4K关注 0票数 1

我使用内存中的HSQLDB开发了一个简单的应用程序,它在Windows上的Websphere Liberty Profile 8.5中运行。现在我已经在z/OS390大型机(Unix)上的Websphere中发布了这样的应用程序,并且我得到了下面的错误。

据了解,它不应该受到操作系统的影响,因为它是相同的jar (hsqldb-2.3.2.jar)、相同的JDK版本(7)和完全相同的myapp.ear文件。

因此,我的直接问题是:在entityManagerFactory创建过程中使用"NoSuchMethodError: javax/持久性/表.索引“的原因是什么?

让我的生活更艰难的是,在我本地的Websphere中部署的完全相同的ear不会弹出这样的错误。一个间接的问题可能是,在Unix中运行内存中的HSQLDB有什么技巧吗?我是不是读错了日志,而这样的错误实际上是由某个错误的Spring配置引起的?我不这么认为,因为正如所说的那样,完全相同的ear在另一个Websphere中运行。

我已经努力了4天,想找出一个可能的原因,但是我找不到。任何建议我都会非常感谢。

错误日志:

代码语言:javascript
复制
WebSphere non-WLM Dispatch Thread t=009bb7a0¨ ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory'
 defined in myapp.config.root.TestConfiguration: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax/persistence/Table.indexes()ÝLjavax/persistence/Index;
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java

TestConfiguration.java

代码语言:javascript
复制
@Configuration
@EnableTransactionManagement
public class TestConfiguration {
    @Bean(initMethod = "init")
    public TestDataInitializer initTestData() {
        return new TestDataInitializer();
    }

    @Bean(name = "datasource")
    public DriverManagerDataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(org.hsqldb.jdbcDriver.class.getName());
        dataSource.setUrl("jdbc:hsqldb:mem:mydb");
        dataSource.setUsername("sa");
        dataSource.setPassword("jdbc:hsqldb:mem:mydb");

        System.out.println("Untill here was printed without error");

        return dataSource;

    }

    @Bean(name = "entityManagerFactory")

    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DriverManagerDataSource dataSource) {

        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setPackagesToScan(new String[]{"myapp.model"});

        entityManagerFactoryBean.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        Map<String, Object> jpaProperties = new HashMap<String, Object>();
        jpaProperties.put("hibernate.hbm2ddl.auto", "create");
        jpaProperties.put("hibernate.show_sql", "true");
        jpaProperties.put("hibernate.format_sql", "true");
        jpaProperties.put("hibernate.use_sql_comments", "true");
        entityManagerFactoryBean.setJpaPropertyMap(jpaProperties);
        System.out.println("Untill here was printed without error also");

        return entityManagerFactoryBean;
    }
}

TestDataInitializer

代码语言:javascript
复制
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.persistence.EntityManagerFactory;
@Component
public class TestDataInitializer {

       @Autowired
       private EntityManagerFactory entityManagerFactory;

       @Autowired
       AnotherModelRepository anotherModelRepository;

       public void init() throws Exception {
              SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

              Session session = sessionFactory.openSession();
              Transaction transaction = session.beginTransaction();

… few session.persit(mymodel)…

POM:

代码语言:javascript
复制
<properties>

              <java-version>1.7</java-version>

              <org.springframework-version>4.1.3.RELEASE</org.springframework-version>

              <spring-security-version>3.2.5.RELEASE</spring-security-version>

              <hibernate.version>4.3.7.Final</hibernate.version>

              <org.slf4j-version>1.6.1</org.slf4j-version>

              <jackson-version>2.4.4</jackson-version>

              <postgres.driver.version>9.3-1100-jdbc41</postgres.driver.version>

       </properties>





       <dependencies>



              <!-- Spring -->

              <dependency>

                     <groupId>org.springframework</groupId>

                     <artifactId>spring-context</artifactId>

                     <version>${org.springframework-version}</version>

                     <exclusions>

                           <!-- Exclude Commons Logging in favor of SLF4j -->

                           <exclusion>

                                  <groupId>commons-logging</groupId>

                                  <artifactId>commons-logging</artifactId>

                           </exclusion>

                     </exclusions>

              </dependency>



              <dependency>

                     <groupId>org.springframework</groupId>

                     <artifactId>spring-webmvc</artifactId>

                     <version>${org.springframework-version}</version>

              </dependency>



              <dependency>

                     <groupId>org.springframework</groupId>

                     <artifactId>spring-tx</artifactId>

                     <version>${org.springframework-version}</version>

              </dependency>



              <dependency>

                     <groupId>org.springframework</groupId>

                     <artifactId>spring-orm</artifactId>

                     <version>${org.springframework-version}</version>

              </dependency>



              <dependency>

                     <groupId>org.postgresql</groupId>

                     <artifactId>postgresql</artifactId>

                     <version>${postgres.driver.version}</version>

              </dependency>



              <dependency>

                     <groupId>org.springframework</groupId>

                     <artifactId>spring-test</artifactId>

                     <version>${org.springframework-version}</version>

              </dependency>



              <!-- Hibernate -->

              <dependency>

                     <groupId>org.hibernate</groupId>

                     <artifactId>hibernate-core</artifactId>

                     <version>${hibernate.version}</version>

              </dependency>



              <dependency>

                     <groupId>org.hibernate</groupId>

                     <artifactId>hibernate-entitymanager</artifactId>

                     <version>${hibernate.version}</version>

              </dependency>



              <!-- Spring security -->

              <dependency>

                     <groupId>org.springframework.security</groupId>

                     <artifactId>spring-security-core</artifactId>

                     <version>${spring-security-version}</version>

              </dependency>



              <dependency>

                     <groupId>org.springframework.security</groupId>

                     <artifactId>spring-security-web</artifactId>

                     <version>${spring-security-version}</version>

              </dependency>



              <dependency>

                     <groupId>org.springframework.security</groupId>

                     <artifactId>spring-security-config</artifactId>

                     <version>${spring-security-version}</version>

              </dependency>



              <dependency>

                     <groupId>com.allanditzel</groupId>

                     <artifactId>spring-security-csrf-token-filter</artifactId>

                     <version>1.1</version>

              </dependency>



              <!-- Logging -->

              <dependency>

                     <groupId>org.slf4j</groupId>

                     <artifactId>slf4j-api</artifactId>

                     <version>${org.slf4j-version}</version>

              </dependency>

              <dependency>

                     <groupId>org.slf4j</groupId>

                     <artifactId>jcl-over-slf4j</artifactId>

                     <version>${org.slf4j-version}</version>

                     <scope>runtime</scope>

              </dependency>

              <dependency>

                     <groupId>org.slf4j</groupId>

                     <artifactId>slf4j-log4j12</artifactId>

                     <version>${org.slf4j-version}</version>

                     <scope>runtime</scope>

              </dependency>

              <dependency>

                     <groupId>log4j</groupId>

                     <artifactId>log4j</artifactId>

                     <version>1.2.16</version>

              </dependency>



              <!-- Jackson JSON Processor -->

              <dependency>

                     <groupId>com.fasterxml.jackson.core</groupId>

                     <artifactId>jackson-databind</artifactId>

                     <version>${jackson-version}</version>

              </dependency>



              <!-- servlet container provided dependencies -->

              <dependency>

                     <groupId>org.apache.tomcat</groupId>

                     <artifactId>tomcat-servlet-api</artifactId>

                     <version>7.0.30</version>

                     <scope>provided</scope>

              </dependency>



              <!-- test dependencies -->

              <dependency>

                     <groupId>com.jayway.jsonpath</groupId>

                     <artifactId>json-path</artifactId>

                     <version>0.8.1</version>

                     <scope>test</scope>

              </dependency>



              <dependency>

                     <groupId>org.apache.commons</groupId>

                     <artifactId>commons-lang3</artifactId>

                     <version>3.3.2</version>

              </dependency>



              <dependency>

                     <groupId>junit</groupId>

                     <artifactId>junit</artifactId>

                     <version>4.12</version>

                     <scope>test</scope>

              </dependency>



              <dependency>

                     <groupId>org.hsqldb</groupId>

                     <artifactId>hsqldb</artifactId>

                     <version>2.3.2</version>

              </dependency>





       </dependencies>



       <build>

              <finalName>my-app</finalName>



              <plugins>

                     <plugin>

                           <groupId>org.apache.maven.plugins</groupId>

                           <artifactId>maven-compiler-plugin</artifactId>

                           <version>2.3.2</version>

                           <configuration>

                                  <source>${java-version}</source>

                                  <target>${java-version}</target>

                           </configuration>

                     </plugin>





                     <plugin>

                           <groupId>org.apache.maven.plugins</groupId>

                           <artifactId>maven-war-plugin</artifactId>

                           <version>2.6</version>

                           <configuration>

                                  <failOnMissingWebXml>false</failOnMissingWebXml>

                           </configuration>

                     </plugin>





              </plugins>

       </build>

</project>

*添加于2016年8月28日凌晨2:45巴西,圣保罗时区感谢提供的出色答案,我终于让我的应用程序像在大型机z/OS390 Websphere ND 8.5中一样在两个Windows Websphere 8.5 Liberty配置文件中运行。我在这里为未来的读者添加了我的解决方案。基本技巧是(1)降级Hibernate以使用JPA2和EntityManager.getDelegate()

代码语言:javascript
复制
@Component

public class TestDataInitializer {



       @Autowired

       private EntityManagerFactory entityManagerFactory;



       @Autowired

       AnotherModelRepository anotherModelRepository;



//    I TOOK @PersistenceContext OUT

/*     @PersistenceContext

       private EntityManager em;*/



       public void init() throws Exception {

//           I REPLACED entityManagerFactory.unwrap AND sessionFactory.openSession OUT

              //SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

//Session session = sessionFactory.openSession();



//            BY createEntityManager AND getDelegate

              EntityManager em = entityManagerFactory.createEntityManager();

              Session session = (Session) em.getDelegate();

              Transaction transaction = session.beginTransaction();



…



@Repository

public class MyModelRepository {

/*     @PersistenceContext

       private EntityManager em;*/





       @Autowired

       private EntityManagerFactory entityManagerFactory;



       public MyModel findMyModelById(Long MyModel) {

              EntityManager em = entityManagerFactory.createEntityManager();

              List<MyModel> MyModels = em.createNamedQuery(MyModel.FIND_BY_ID, MyModel.class).setParameter("MyModelId", MyModel).getResultList();



              return MyModels.size() == 1 ? MyModels.get(0) : null;

       }







       public List<MyModel> findOutByIn(Integer certainId){

              //SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

              EntityManager em = entityManagerFactory.createEntityManager();

              Session session = (Session) em.getDelegate();



              String query = "select c from … c "

                     + " inner join … o "

                     + " where …;



              //Session session = sessionFactory.openSession();

              Transaction transaction = session.beginTransaction();

              List<MyModel> l = session.createQuery(query).list();



        return l;



       }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-27 16:41:41

你得到了下面的错误。

代码语言:javascript
复制
Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax/persistence/Table.indexes()ÝLjavax/persistence/Index;

此错误指示所需的方法在特定类中不可用。可以在JPA2.1JAR (hibernate- JPA - 2.1 -api)的"javax.persistence.Table“类中找到"indexes()”方法。在你的部署中,它是如何选择JPA2.0JAR (hibernate- JPA - 2.0 -api)的,它在Table类中没有这个方法。在您的pom.xml中,您正在使用"hibernate-entitymanager 4.3.7.Final",它提供了JPA2.1JAR文件。请在收到此错误的服务器中查找JPA2.0JARS文件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39176612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档